python异常报错(ValueError: multi-byte encodings are not supported)的解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28847617/article/details/87857446

(1)、直接上代码:

#!/usr/bin/python3
#coding=gbk

data_file='X1550658004008726.xml'

import xml.etree.ElementTree as ET

import re

try:
        '''
        正常解析xml编码格式是utf-8的
        '''
        object_data=ET.ElementTree(file=data_file)

except Exception as error:

        '''
        解析不正常的编码格式gbk或者是gb2312
        '''
        with open(data_file,mode='r',encoding='gb2312') as file_r,open('%s.bak' % (data_file),mode='w',encoding='utf-8') as file_w:

                for data_text in file_r.readlines():

                        if re.search(r'encoding="gb2312"',data_text,re.I):

                                new_data=re.sub(r'encoding="gb2312"','encoding="utf-8"',data_text)

                                file_w.write(new_data)

                        elif re.search(r'encoding="gbk"',data_text,re.I):

                                new_data=re.sub(r'encoding="gbk"','encoding="utf-8"',data_text)

                                file_w.write(new_data)
                        else:
                                file_w.write(data_text)

                file_r.close()

                file_w.close()

        object_data=ET.ElementTree(file='%s.bak' % (data_file))

finally:

        print(object_data)

        root=object_data.getroot()

        print("根元素名:",root.tag)

        print("根元素属性列表:",root.attrib)

        print("根元素属包含内容:",root.attrib)

        column_sort=root.iter(tag='FieldNo')

        ###############整理元素映射字典关系###############

        key_names=[]

        for sub_tag in column_sort:

                ###print("寻找到的元素包含内容",sub_tag.text)

                key_names.append(sub_tag.text)

        print("键名列表:",key_names)

        column_names=root.iter(tag='FieldName')

        value_names=[]

        for sub_tag in column_names:

                ####print("寻找到的元素包含内容",sub_tag.text)

                value_names.append(sub_tag.text)

        print("值列表:",value_names)

        data_map=dict(zip(key_names,value_names))

        print(data_map)

(2)、xml源文件(X1550658004008726.xml):

<?xml version="1.0" encoding="gb2312"?>
<xml>
<FILE_STRUCTURE>
        <Field>
                <FieldNo>0</FieldNo>
                <FieldName>RELATED_PROVINCE_NAME</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>RELATED_PROVINCE_NAME</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>1</FieldNo>
                <FieldName>RELATED_CITY_NAME</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>RELATED_CITY_NAME</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>2</FieldNo>
                <FieldName>RELATED_COUNTY_NAME</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>RELATED_COUNTY_NAME</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>3</FieldNo>
                <FieldName>RELATED_SITE_CUID</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>RELATED_SITE_CUID</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>4</FieldNo>
                <FieldName>RES_CODE</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>RES_CODE</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>5</FieldNo>
                <FieldName>DEVICE_CODE</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>DEVICE_CODE</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>6</FieldNo>
                <FieldName>TYPE</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>TYPE</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>7</FieldNo>
                <FieldName>LABEL_CN</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>LABEL_CN</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>8</FieldNo>
                <FieldName>SIGNAL_STA_NAME</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>SIGNAL_STA_NAME</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>9</FieldNo>
                <FieldName>VALUE</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>VALUE</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>10</FieldNo>
                <FieldName>REPORTED_TIME</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>REPORTED_TIME</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>11</FieldNo>
                <FieldName>battery_capacity</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>battery_capacity</FieldNameOther>
        </Field>
        <Field>
                <FieldNo>12</FieldNo>
                <FieldName>dc_load_current</FieldName>
                <FieldType>SQL_VARCHAR(255)</FieldType>
                <FieldNameOther>dc_load_current</FieldNameOther>
        </Field>
</FILE_STRUCTURE>
</xml>

(3)、最终执行输出结果(自行根据想法来提取元素):

<xml.etree.ElementTree.ElementTree object at 0x7f56f2036160>
根元素名: xml
根元素属性列表: {}
根元素属包含内容: {}
键名列表: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
值列表: ['RELATED_PROVINCE_NAME', 'RELATED_CITY_NAME', 'RELATED_COUNTY_NAME', 'RELATED_SITE_CUID', 'RES_CODE', 'DEVICE_CODE', 'TYPE', 'LABEL_CN', 'SIGNAL_STA_NAME', 'VALUE', 'REPORTED_TIME', 'battery_capacity', 'dc_load_current']
{'0': 'RELATED_PROVINCE_NAME', '1': 'RELATED_CITY_NAME', '2': 'RELATED_COUNTY_NAME', '3': 'RELATED_SITE_CUID', '4': 'RES_CODE', '5': 'DEVICE_CODE', '6': 'TYPE', '7': 'LABEL_CN', '8': 'SIGNAL_STA_NAME', '9': 'VALUE', '10': 'REPORTED_TIME', '11': 'battery_capacity', '12': 'dc_load_current'}

猜你喜欢

转载自blog.csdn.net/qq_28847617/article/details/87857446