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编码格式。
因此我们只需要直接用就可以了。以上两种情况是我目前遇到的两种关于解码,编码的两种情况。