python XML文件读取及多文件遍历和txt文件去重

问题1:python脚本读取xml文件?

xml文件示例:

xml文件示例
读取的效果:分别读取类别名称和位置信息并保存在classes1.txt和TrainList.txt文件里,效果图如下
在这里插入图片描述

目录结构如下:

在这里插入图片描述

总代码如下:

import xml.etree.ElementTree as ET
import os
import numpy as np
xml_file = './test-xml'

SaveDir1='classes.txt'  # 保存类别名称文件
SaveDir2='TrainList.txt' # 保存每个实例位置
SaveDir3='classes1.txt'  # 保存非重复类别文件
imgfile='img'

files= os.listdir(xml_file)
files1= os.listdir(imgfile)


for file,name in zip(files,files1):
    position = xml_file+'/'+ file
    print(position)
    tree = ET.parse(position)
    root = tree.getroot()
    for size in root.iter('size'):
        width = int(size.find('width').text)
        height = int(size.find('height').text)
        
    print('图像宽',width,'图像高',height)
    
    with open(SaveDir2, 'a+') as f:
        f.write(name+ " ")
        
    for obj in root.iter('object'):
        cls = obj.find('name').text
   
        xmlbox = obj.find('bndbox')

        
        xmin = int(xmlbox.find('xmin').text)
        ymin = int(xmlbox.find('ymin').text)
        xmax = int(xmlbox.find('xmax').text)
        ymax = int(xmlbox.find('ymax').text)
        num=[xmin,ymin,xmax,ymax]
        #np.savetxt(SaveDir2,num,fmt='%d',newline=',')
        with open(SaveDir2, 'a+') as f:
            np.savetxt(f, num,fmt='%d',newline=',')
            
            
        print('类型',cls,'xmin',xmin,'ymin',ymin,'xmax',xmax,'ymax',ymax)
        with open(SaveDir1,"a",encoding="utf-8") as f:
            f.write(cls + "\n")
            f.flush()
            f.close()
    
    with open(SaveDir2, 'a+') as f:
        f.write('\n')
       
    f_read = open(SaveDir1, 'r', encoding='utf-8') # 要去重的文件
    txt = f_read.readlines()
    
    for w in txt:
        f_write=open(SaveDir3, 'r')
        txt2 = f_write.readlines()
        with open(SaveDir3, 'a',encoding='utf-8') as f:
            if w not in txt2:
                f.write(w)
            else:
                print("已去除重复-->"+w)
            f.close()
            
    f_read.close()
    print('完成')

相关问题总结

1.如何同时遍历多个文件名字?

for file,name in zip(files,files1)函数

files= os.listdir(xml_file)
files1= os.listdir(imgfile)
for file,name in zip(files,files1):
	position = xml_file+'/'+ file
    print(position)
    tree = ET.parse(position)
    root = tree.getroot()
    for size in root.iter('size'):
        width = int(size.find('width').text)
        height = int(size.find('height').text)
        
    print('图像宽',width,'图像高',height)
    
    with open(SaveDir2, 'a+') as f:
        f.write(name+ " ")

2.如何对txt文件里重复的字符串取重?

    with open(SaveDir2, 'a+') as f:
        f.write('\n')
       
    f_read = open(SaveDir1, 'r', encoding='utf-8') # 要去重的文件
    txt = f_read.readlines()
    
    for w in txt:
        f_write=open(SaveDir3, 'r') # 去重保存文件
        txt2 = f_write.readlines()
        with open(SaveDir3, 'a',encoding='utf-8') as f:
            if w not in txt2:
                f.write(w)
            else:
                print("已去除重复-->"+w)
            f.close()
            
    f_read.close()
    print('完成')

3.如何追加保存int类型数据:

将int类型转化为数组,用 np.savetxt()保存,而不是用 f.write()保存。

        xmin = int(xmlbox.find('xmin').text)
        ymin = int(xmlbox.find('ymin').text)
        xmax = int(xmlbox.find('xmax').text)
        ymax = int(xmlbox.find('ymax').text)
        num=[xmin,ymin,xmax,ymax]
        #np.savetxt(SaveDir2,num,fmt='%d',newline=',')
        with open(SaveDir2, 'a+') as f:
            np.savetxt(f, num,fmt='%d',newline=',')  # 将int类型数据追加保存到同一行
            
            
        print('类型',cls,'xmin',xmin,'ymin',ymin,'xmax',xmax,'ymax',ymax)
        with open(SaveDir1,"a",encoding="utf-8") as f:
            f.write(cls + "\n") # 对不同文件数据保存时换行
            f.flush()
            f.close()
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磁生电

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值