#解决的问题为:更改VOC标注数据xml文件信息
参考:
【python】删掉文件头<?xml version="1.0" encoding="utf-8"?>_聿默的博客-CSDN博客
Python批量更改xml文件属性_小飞侠的博客-CSDN博客
Python实现ANSI文件转UTF-8 - Hello_2018 - 博客园 (cnblogs.com)
出现的问题:
打开xml文件:This page contains the following errors: error on line 4 at column 8: Encoding error
读取xml文件:python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # coding=utf-8
# 数据处理 import codecs import os import xml.dom.minidom from xml.dom.minidom import Document, parse
class data_process(Document): def __init__(self): super(data_process, self).__init__() pass
# 准备重写方法,但是没实现,就放着吧 def writexml(self, writer, indent="", addindent="", newl="", encoding=None): if encoding is None: # writer.write('<?xml version="1.0" ?>'+newl) 原先代码 writer.write(newl) else: writer.write('<?xml version="1.0" encoding="%s"?>%s' % ( encoding, newl)) for node in self.childNodes: node.writexml(writer, indent, addindent, newl)
def chang_xml(self, path="./change_annotations"): # 标注文件夹地址 files = os.listdir(path) # 得到文件夹下所有文件名称 for xmlFile in files: # 遍历文件夹 if not os.path.isdir(xmlFile): # 判断是否是文件夹,不是文件夹才打开 # TODO # 将获取的xml文件名送入到dom解析 dom = xml.dom.minidom.parse(os.path.join(path, xmlFile)) # 拼接文件路径 root = dom.documentElement # 获取标签对name/pose之间的值 name = root.getElementsByTagName('name') # name是xml文件中的<name>标签
for i in range(len(name)): print(name[i].firstChild.data) if name[i].firstChild.data == "STD": name[i].firstChild.data = 'standing' # 更改标签内容 with open(os.path.join(path, xmlFile), 'w') as fh: dom.writexml(fh) # 重新写入,但是会存在将<?xml version="1.0" ?>写入文件中,导致文件不可用,可以直接minidom.py中删除 # 寻找minidom.py, 按着ctrl,鼠标左键单机writexml(fh)函数,之后搜索<?xml version="1.0" ?>,边找到了,write,然后删除<?xml version="1.0" ?> # 此外,如果xml文件中存在中文,则dom.writexml(fh, encoding="utf-8")不能用,如果没有中文,那么尽量加上encoding="utf-8",否则可能编码问题导致文件错误
# 那么下面就更改文件的编码方式,ANSI文件转UTF-8 def ANSI_to_UTF_8(self, path="./change_annotations"): # 注释文件所在目录, xml注释文件文件夹 files = os.listdir(path) # xml文件 for file in files: file_name = os.path.join(path, file) f = codecs.open(file_name, 'r', 'ansi') ff = f.read() file_object = codecs.open(file_name, 'w', 'utf-8') file_object.write(ff)
data_process().chang_xml(path="./change_annotations") data_process().ANSI_to_UTF_8(path="./change_annotations") |