python中xml Excel解析编码小结

本文介绍了一个使用Python将Excel数据转换为XML文件的过程,并详细讨论了解决编码问题的方法,包括如何处理Unicode与UTF-8之间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python语言语法什么的还是比较简单的,像我这个学c语言的人学了半个月就敢在公司的项目中使用就可以看出python入门还是比较简单的。当然,作为一个菜鸟,使用中肯定是遇到很多问题的,比如令我相当头疼的就是编码问题了。公司的需求是让我解析xml(Excel)来转化为Excel(xml),编码问题肯定是要考虑的问题。我用的是python自带的模块xml.dom.minidom来解析xml的,excel解析和生成用的是xlrd和xlwd,这里不多赘述,现在主要讲我遇到的问题。代码:

def GenerateXml():

    execlDataList = excel_table_byindex(file="file.xls") #获取表格数据的列表形式

    impl = xml.dom.minidom.getDOMImplementation()
    dom = impl.createDocument(None, 'user', None)
    root = dom.documentElement
    #employee = dom.createElement('COMP')
    #root.appendChild(employee)

    for row in execlDataList:
        nameE=dom.createElement('userInfo')
        for key in row:
            tmpkey = key
            tmpvalue = row[key]
            tmpkey = tmpkey.encode("utf-8")
            tmpvalue = tmpvalue.encode("utf-8")
            print type(tmpkey)
            print type(tmpvalue)
            nameE.setAttribute(tmpkey,tmpvalue) #增加属性
        root.appendChild(nameE)

    f= open('config_new.xml', 'a')
    #buf = StringIO.StringIO()
    dom.writexml(f, addindent='  ', newl='\n', encoding="utf-8")
    ##writexml(writer, indent, addindent, newl, encoding)
    #writer是文件对象
    #indent是每个tag前填充的字符,如:'  ',则表示每个tag前有两个空格
    #addindent是每个子结点的缩近字符
    #newl是每个tag后填充的字符,如:'/n',则表示每个tag后面有一个回车
    #encoding是生成的XML信息头中的encoding属性值,在输出时minidom并不真正进行编码的处理,如果你保存的文本内容中有汉字,则需要自已进行编码转换。
    f.close()

    return f

这个函数主要是将解析到的Excel表格信息转化成xml消息。
在我看来,我们只要记住一点就是,python处理字符串的时候,,默认都是用的Unicode就好了。
而xml或者Excel中的字符串都是utf-8或者gbk等等其它。我们当然要转码了!
比如,我要写一个编码格式为utf-8的xml消息,我们就要在最后生成xml文件时将字符编码转为utf-8就好了。就是这么简单。当然我们转的时候应该建一个临时变量来接受key value的值,如果直接key = key.encode(“utf-8”),row[key] = row[key].encode(“utf-8”)这么转的话是要报错的,key转成了utf-8格式,第二句就会报错,因为我们通过utf-8的key是查不到row[key]的。用一个临时变量来接收处理是一个好习惯。

excel如下:
这里写图片描述

这是生成的xml消息

<?xml version="1.0" encoding="utf-8"?>
<user>
  <userInfo 地址="172.16.1.239" 姓名="田振华" 用户="tianzh" 电话="15011262015" 索引="1" 配置="/etc"/>
  <userInfo 地址="1.1.1.1" 姓名="龚凡" 用户="gongf" 电话="110" 索引="2" 配置="/usr"/>
  <userInfo 地址="2.2.2.2" 姓名="安吉旺" 用户="anjw" 电话="120" 索引="3" 配置="/lib"/>
</user>
<?xml version="1.0" ?>
<user>

以上讲到的是我们直接从Excel文件中解析得到的字符串,我们经过转码写到xml中,这种情况是我们得到的字符串已经是Unicode的类型的字符串了,比如我们Excel中字符串“姓名”我们解析到的为u”\u59d3\u540d”,但是当我们自己自python代码中自己定义的中文字符串呢?如我们在一个utf-8编码的py文件中定义一个变量

key_list = [u"username",u"索引",u"姓名",u"配置",u"地址",u"电话"]

我们用print打印key_list也是这样的吗
结果证明python会帮我们解码为

[u'username', u'\u7d22\u5f15', u'\u59d3\u540d', u'\u914d\u7f6e', u'\u5730\u5740', u'\u7535\u8bdd']

如果这样定义呢
key_list = [“username”,”索引”,”姓名”]
打印出来是这样的
[‘\xe7\x94\xa8\xe6\x88\xb7’, ‘\xe7\xb4\xa2\xe5\xbc\x95’, ‘\xe5\xa7\x93\xe5\x90\x8d’,]
python会按utf-8转码,字符串不是Unicode编码格式,我们用之前还需要进行解码,因此,我们定义中文字符串的最好的方法就是每个字符串前面加u来表示字符串为Unicode编码格式。
因此我们只需要直接用就可以了。以上两种情况是我目前遇到的两种关于解码,编码的两种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值