我正在尝试从xml文件中提取数据并将其写入所需格式的文本文件中。我希望以下给定格式的数据写在文本文件中:
bus 616.0 804.0 852 832
car 399.5 630.5 297 259
bus 545.5 983.0 255 54
但我以这种格式获取数据:
[' bus 616.0 804.0 852 832 ', ' car 399.5 630.5 297 259 ', ' bus 545.5 983.0 255 54 ']
这是我的python代码:
import os
from xml.etree import ElementTree
path = 'C:\\Users\\Microsoft\\Desktop\\xmltxt\\xmlfiles'
dirs = os.listdir( path )
savedir='textfiles'
objects =[]
for image_file in (dirs):
if not os.path.isdir(savedir):
os.mkdir(savedir)
dom=ElementTree.parse(os.path.join(path, image_file))
labels=dom.findall('object')
for lbl in labels:
obj_struct = {}
name=lbl.find('name').text
bbox = lbl.find('bndbox')
xmin,xmax,ymin,ymax = int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)
midx=(xmax+xmin)/2
midy=(ymax+ymin)/2
wid=abs(xmax-xmin)
hgt=abs(ymax-ymin)
values=(' {} {} {} {} {} '.format(name,midx,midy,wid,hgt))
print (values)
objects.append(values)
save_path = os.path.join(savedir, image_file.replace('xml', 'txt'))
with open(save_path, 'w') as temp_xml:
temp_xml.write(str(objects))
答案 0 :(得分:0)
objects
是一个列表。因此,如果你写它,你将获得一个列表的再现。但实际上你需要分别使用每一行。
您需要将输出代码更改为以下内容:
with open(save_path, 'w') as temp_xml:
temp_xml.write('\n'.join([str(x).strip() for x in objects]))
更新:如上所述,如果此行删除空格,则不需要其中一些:
values=(' {} {} {} {} {} '.format(name,midx,midy,wid,hgt))
应该是
values=('{} {} {} {} {}'.format(name,midx,midy,wid,hgt))
然后它可以简化为
with open(save_path, 'w') as temp_xml:
temp_xml.write('\n'.join(objects))