Lxml ElementTree удаляет форматирование

Я объединяю элементы 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.

mzjn 30.03.2021 09:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
40
0

Другие вопросы по теме