Я объединяю элементы lxml в ElementTree, а затем записываю в файл. Я не могу понять, почему, но когда я перехожу к разделу кода ElementTree, форматирование \ n удаляется, поэтому он записывает в файл одной строкой вместо того, как обычно его печатает pretty_print.
from lxml import etree as ET
if __name__ == '__main__':
test_dict_object = {"FilePath": "resources/Toby Keith song.mp3",
"Author": "Camron",
"Title": "Hey Ma (Sincere Edit)",
"SongLength": "222.224000",
"FirstSeen": "1495380849"
}
song = ET.Element("Song")
# create xml from dictionary
for key, value in test_dict_object.items():
sub_element = ET.SubElement(song, key)
sub_element.attrib["value"] = value
# Save in model
temp_data = []
temp_data.append(song)
# Build XML from model
print("\n---TEST STARTS NOW---")
root = ET.Element("Database")
root.attrib['Version'] = "8.2"
root.text = "\n"
for obj in temp_data:
print(f"Appending Element... {obj}")
root.append(obj)
pretty_song = ET.tostring(obj,
pretty_print=True)
print(f"Element: \n{pretty_song}\n")
# ....Fails here.....
doc = ET.ElementTree(root)
print(f"Element Tree:")
print(ET.tostring(doc, pretty_print=True))
Это результат:
---TEST STARTS NOW---
Appending Element... <Element Song at 0x7f9e7519e400>
Element:
b'<Song>\n <FilePath value = "resources/Toby Keith song.mp3"/>\n <Author value = "Camron"/>\n <Title value = "Hey Ma (Sincere Edit)"/>\n <SongLength value = "222.224000"/>\n <FirstSeen value = "1495380849"/>\n</Song>\n'
Element Tree:
b'<Database Version = "8.2">\n<Song><FilePath value = "resources/Toby Keith song.mp3"/><Author value = "Camron"/><Title value = "Hey Ma (Sincere Edit)"/><SongLength value = "222.224000"/><FirstSeen value = "1495380849"/></Song></Database>\n'
Я ожидаю, что результат после Element Tree будет таким же, как и после Element.
Я сузил область кода, но не понимаю, что происходит. Почему форматирование удаляется при выполнении функции ET.ElementTree (root)?






Попробуйте удалить эту строку:
root.text = "\n". Добавляя вручную лишние пробелы, вы мешаете красивой печати lxml.