在 Python 的 XML 文件中编辑项目

Editing Items in an XML File in Python

我正在尝试从 .csv 文件中获取数据并为每一行创建单独的 .xml 文件。我已经将 .csv 读入了 Pandas。我苦苦挣扎的地方是试图弄清楚如何在 .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 这四个项目的值。

我假设您阅读了 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>

我的偏好在于使用xmltodict。但是从您发布的 link 来看,您似乎想从标签内而不是标签(您的 xml 中不存在)制作 .find("filename") -数据也在评论中说明)。

也就是说,您的代码可以更改为 "minimally"(我对 ElementTree 的了解还不足以说明最佳解决方案是什么):

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