在 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"
我正在尝试从 .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"