工具代码

#解决的问题为:更改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")

 

上一篇:浏览器渲染原理及性能优化


下一篇:2022/2/22