【发布时间】:2021-09-23 05:41:44
【问题描述】:
我正在尝试根据 csv 列替换 xml 文件中的类名。其实xml文件就是注解文件。
这是xml的格式:
<annotation>
<folder>./test_xmls</folder>
<filename>000048_Panorama.jpg</filename>
<path>./images000048_Panorama.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>4000</width>
<height>2000</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>AAAA</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
我的 csv 包含 original 列并更改为`列。
格式为:
|original | change to|
--------------------------
| AAAA | class_A |
..................
Csv 有超过 20000 行,其中包括 80000 个 xml 文件中的所有 <name>AAAA</name>。
我想将 xml 名称(如 AAAA)与 csv 列匹配。如果它存在于original 列中,那么我想用change to 中的相应值替换,比如AAAA 到class_A。
我尝试编写 python 代码,但它不起作用。 我的代码在这里
import xml.etree.ElementTree as ET
import os
import pandas as pd
from collections import defaultdict
import csv
from csv import reader
with open('table.csv', mode='r') as inp:
reader = csv.reader(inp)
dict_from_csv = {rows[0]:rows[2] for rows in reader}
#print(dict_from_csv)
root_path = "./xmls"
xml_list = sorted(os.listdir(root_path))
for xml_file in xml_list:
xml_path = os.path.join(root_path,xml_file)
# parse xml file
tree = ET.parse(xml_path)
# get root node
root = tree.getroot()
for member in root.findall('object'):
sub_child = member[0].text
print(sub_child)
for key, value in dict_from_csv.items():
if sub_child in key:
sub_child = sub_child.replace(sub_child, value)
#print(xml)
xml_file.write(sub_child)
print("Classes are changed : " + xml_path)
任何帮助将不胜感激。
谢谢
【问题讨论】:
标签: python python-3.x xml python-2.7 csv