Как красиво ЗАПИСАТЬ файл .xml с помощью xml.etree.ElementTree

Я искал много способов записи XML-файлов, таких как lxml, minidom и т. д. Однако ни один из них не делает то, что я хочу. Начну с нуля. Я выбрал xml.etree.ElementTree. Вот мой код

from xml.etree.ElementTree import Element, SubElement, ElementTree, tostring
from xml.dom import minidom

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent = "  ")

Clip = Element('Clip')
tree = ElementTree(Clip)

Header = SubElement(Clip, 'Header')

Filename = SubElement(Header, 'Filename')
Filename.text = "C001101_001.mp4"

Duration = SubElement(Header, 'Duration')
Duration.text = "00:07:13"

Alarms =  SubElement(Clip, 'Alarms')
Alarm =  SubElement(Alarms, 'Alarm')

StartTime = SubElement(Alarm, "StartTime")
StartTime.text = "00:03:27"

AlarmDescription = SubElement(Alarm, "AlarmDescription")
AlarmDescription.text = "Loitering"

AlarmDuration = SubElement(Alarm, "AlarmDuration")
AlarmDuration.text = "00:00:44"

print(prettify(Clip))
tree.write(open("obbo.xml", "wb"))

print(prettify(Clip)) выводит это на консоль

<?xml version = "1.0" ?>
<Clip>
  <Header>
    <Filename>C001101_001.mp4</Filename>
    <Duration>00:07:13</Duration>
  </Header>
  <Alarms>
    <Alarm>
      <StartTime>00:03:27</StartTime>
      <AlarmDescription>Loitering</AlarmDescription>
      <AlarmDuration>00:00:44</AlarmDuration>
    </Alarm>
  </Alarms>
</Clip>

Я хочу записать файл obbo.xml как точно в виде печатной формы, tree.write(open("obbo.xml", "wb")) записывает, но в одной строке:

<Clip><Header><Filename>C001101_001.mp4</Filename><Duration>00:07:13</Duration></Header><Alarms><Alarm><StartTime>00:03:27</StartTime><AlarmDescription>Loitering</AlarmDescription><AlarmDuration>00:00:44</AlarmDuration></Alarm></Alarms></Clip>

Надеюсь, ты сможешь помочь ~

Почему бы не использовать prettify в корневом элементе (ну, на самом деле вы это уже сделали) и не записать полученную строку в файл?

Michael Butscher 27.12.2018 04:01

@MichaelButscher На данный момент это не проблема, я могу потом оптимизировать код, в любом случае спасибо

bit_scientist 27.12.2018 05:03

Уже ответил здесь stackoverflow.com/questions/749796/… с большим количеством перечисленных опций. В вашем случае вы можете просто сохранить вывод prettify(Clip) в файл вместо tree.write(...).

Poolka 27.12.2018 08:04

@Poolka, я это уже видел, они о печати, а не о записи нового файла в желаемом формате.

bit_scientist 27.12.2018 09:32

Прочтите Распечатать, как пользоваться file=...

stovfl 27.12.2018 09:55

@voo_doo Печать в консоль и запись в файл - это одна и та же операция на уровне, на котором вы используете функции print и write. Единственное отличие - место назначения - консоль или файл. В вашем коде prettify(Clip) дает вам довольно отформатированную строку. Используйте его как хотите - распечатайте на консоли или сохраните в файл. Связанный вопрос описывает несколько способов создания хорошо отформатированной строки XML-данных с помощью Python.

Poolka 27.12.2018 11:23

Отвечает ли это на ваш вопрос? Как мне заставить Python ElementTree красиво печатать в XML-файл?

Josh Correia 12.02.2020 19:16
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
7
1 126
0

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