读取xml文件写到csv文件中
·
#xml数据提取,拼合为csv文件
import os
import csv
import xml.dom.minidom
import glob
def to_int(str_value):
try:
return int(str_value)
except ValueError:
try:
float_value = float(str_value)
return int(float_value)
except ValueError:
return None
def get_damage_code(damage_type):
"""
根据损伤类型返回相应的代码。
参数:
damage_type (str): 损伤类型名称。
返回:
int: 对应的损伤代码,如果损伤类型未知则返回None。
"""
if damage_type == "bolt":
return 30
elif damage_type == "bolt crack":
return 31
elif damage_type == "head_unknow_1":
return 501
elif damage_type == "head_unknow_2":
return 502
elif damage_type == "head_unknow_3":
return 503
elif damage_type == "joint":
return 600
elif damage_type == "joint_1":
return 601
elif damage_type == "joint_3":
return 602
elif damage_type == "jietou":
return 300
elif damage_type == "phantom wave":
return 504
elif damage_type == "linehole":
return 32
elif damage_type == "bolt_loss_white":
return 701
elif damage_type == "bolt_loss_red":
return 702
elif damage_type == "bolt_crack_h":
return 703
elif damage_type == "head crack":
return 505
elif damage_type == "bottom crack":
return 800
elif damage_type == "badMidBolt":
return 704
elif damage_type == "hanfengMidFlaw":
return 900
elif damage_type == "unknown_45_white":
return 705
elif damage_type == "unknown_45_red":
return 706
else:
return None # 如果损伤类型不匹配任何已知类型,则返回None
def xml_to_csv(xml_files, csv_path):
last_max_xmax = 0 # 初始化前一个文件的xmax最大值
# 打开一个新的CSV文件用于写入
with open(csv_path, 'w', newline='') as csvfile:
csvwriter = csv.writer(csvfile)
# 写入CSV的表头
csvwriter.writerow(['xmin', 'ymin', 'xmax', 'ymax','Injury'])
# 遍历所有XML文件
for xml_file in xml_files:
dom = xml.dom.minidom.parse(xml_file)
root = dom.documentElement
local_max_xmax = 0 # 初始化当前文件的xmax最大值
# 获取所有bndbox节点
bndboxes = root.getElementsByTagName('object')
# 遍历每个bndbox节点
for bndbox in bndboxes:
xmin = to_int(bndbox.getElementsByTagName('xmin')[0].firstChild.data)
ymin = to_int(bndbox.getElementsByTagName('ymin')[0].firstChild.data)
xmax = to_int(bndbox.getElementsByTagName('xmax')[0].firstChild.data)
ymax = to_int(bndbox.getElementsByTagName('ymax')[0].firstChild.data)
Injury = get_damage_code(bndbox.getElementsByTagName('name')[0].firstChild.data)
# 如果这不是第一个文件,将前一个文件的xmax最大值加到当前文件的xmin值上
if last_max_xmax > 0:
xmin += last_max_xmax+3000
xmax += last_max_xmax+3000
# 更新当前文件的xmax最大值
if xmax is not None:
local_max_xmax = max(local_max_xmax, xmax)
print(local_max_xmax)
# 写入每个节点的值到CSV
csvwriter.writerow([xmin, ymin, xmax, ymax,Injury])
# 更新全局xmax最大值
last_max_xmax = local_max_xmax
def get_xml_files(path):
# 使用glob模块获取所有XML文件
return glob.glob(os.path.join(path, '*.xml'))
if __name__ == '__main__':
# xml_path = 'F:\\zhengwangwork\\H\\样本\\完整的伤损样本库20240313\\完整的伤损样本库20240308\\xml'
# xml_path = 'F:\\testcsv\\xml'
xml_path = 'F:\\png'
# csv_path = 'F:\\testcsv\\output_xml.csv'
csv_path = 'F:\\testcsv\\6.csv'
xml_files = get_xml_files(xml_path)
xml_to_csv(xml_files, csv_path)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)