Редактирование элементов в XML-файле на Python - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь взять данные из CSV-файла и создать отдельные XML-файлы для каждой строки.Я уже прочитал .csv в Панд.Я пытаюсь понять, как вносить изменения в XML-файлы.

Я использую этот предыдущий ответ в качестве руководства, чтобы попытаться изучить это:

Ссылка

Применение авторского решения к моим данным выглядело бычто-то вроде этого:

data = """<annotation>
    <folder>VOC2007</folder>
    <filename>abc.jpg</filename>
    <object>
        <name>blah</name>
        <pose>unknown</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>0</xmin>
            <ymin>0</ymin>
            <xmax>0</xmax>
            <ymax>0</ymax>
        </bndbox>
    </object>
</annotation>
"""

Затем я делаю это:

tree = et.fromstring(data)

Где я застрял, это следующая часть.Автор редактирует свой файл с помощью этой строки кода:

for data in tree.findall("data"):
    name = data.attrib["name"]
    value = data.find("value")
    value.text = "[%s] %s" % (name, value.text)

Я пытаюсь применить его к своему так:

for data in tree.findall("data"):  
    filename = data.find("filename")
    filename.text = "001.jpg"

Но это, кажется, ничего не меняет, когдаЯ распечатал это.

print(et.tostring(tree))

Что я делаю не так или какие шаги нужно предпринять, чтобы изменить имя изображения с 'abc.jpg' на '001.jpg'?

Также пытаюсьвыяснить, как изменить значения для четырех элементов xmin, ymin, xmax и ymax.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я предпочитаю использовать xmltodict .Но из ссылки, которую вы разместили, кажется, что вы хотите создать .find («имя файла») из тега, а не тега (которого нет в ваших xml-данных, как указано в комментарии).

То есть ваш код может быть изменен "минимально" (я недостаточно хорошо знаю ElementTree, чтобы сказать, какое решение лучше) на что-то вроде:

for annotation in tree.findall("annotation")
    filename = annotation.find("filename")
    filename.text = "001.jpg"
0 голосов
/ 26 сентября 2018

Я предполагаю, что вы читаете ваш CSV-файл и извлекаете коллекцию словарных записей, например:

record = {
    'folder': "VOC2007",
    'filename': "abc.jpg",
    'name': "blah",
    'pose': "unknown",
    'truncated': "0",
    'difficult': "0",
    'xmin': "0",
    'ymin': "0",
    'xmax': "0",
    'ymax': "0",
}

Простая вещь, которую вы можете сделать, это использовать шаблон строки для генерации вашего XMLконтент (так как он очень прост):

import textwrap

template = textwrap.dedent("""\
<annotation>
    <folder>{folder}</folder>
    <filename>{filename}</filename>
    <object>
        <name>{name}</name>
        <pose>{pose}</pose>
        <truncated>{truncated}</truncated>
        <difficult>{difficult}</difficult>
        <bndbox>
            <xmin>{xmin}</xmin>
            <ymin>{ymin}</ymin>
            <xmax>{xmax}</xmax>
            <ymax>{ymax}</ymax>
        </bndbox>
    </object>
</annotation>""")

Чтобы сгенерировать контент XML, вы можете сделать:

from xml.sax.saxutils import escape

escaped = {k: escape(v) for k, v in record.items()}
data = template.format(**escaped)

Функция xml.sax.saxutils.escape используется дляпреобразуйте «<«, «>» и «&» в объекты XML.

Результат:

<annotation>
    <folder>VOC2007</folder>
    <filename>abc.jpg</filename>
    <object>
        <name>blah</name>
        <pose>unknown</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>0</xmin>
            <ymin>0</ymin>
            <xmax>0</xmax>
            <ymax>0</ymax>
        </bndbox>
    </object>
</annotation>
...