1、使用python处理excel表格时,其中一个比较难缠的问题:unicode编码
因为python的默认字符编码都为unicode,所以打印从excel中读出的中文或读取中文名的excel表或sheet时,程序提示错误UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)。这是由于在windows中,中文使用了gb2312编码方式,python将其当作unicode和ascii来解码都不正确才报出的错误。使用VAR.encode('gb2312')即可解决打印中文的问题。(很奇怪,有的时候虽然能打印出结果,但显示的不是中文,而是一堆编码。)若要从中文文件名的excel表中读取数据或者读取中文字符,可在前加‘u’表示将该中文文件名采用unicode编码。举例说明:DTS导出的问题单列表默认使用unicode编码,诉求:判断问题单描述中是否包含“同步”字符,如果按照下面这个方式写:
print df['Brief'].str.contains('同步')
则一直返回false:
当改成:
print df['Brief'].str.contains(u'同步')
则可达成我们的预期:
2、
读取文件,格式问题
读取xml文件时,xml里面包含有中文,所以要使用utf-8格式读取,若xml文档中有声明可正常读取:
若xml开头无声明:
执行读取xml语句:DOM = xml.dom.minidom.parse(single_file_path)则报编码错误:
not well-formed (invalid token): line 1, column 1
修改方法:在读取xml前进行编码置换:single_file_path.encode('utf8')
3、从DTS下载的问题单列表,默认不是excel格式,是xml格式,若不做格式变换,则在调用:
data = xlrd.open_workbook(single_file_path);
提示格式错误,无法解析,故需要进行xml到excel的转换
data = xlrd.open_workbook(single_file_path);
提示格式错误,无法解析,故需要进行xml到excel的转换
def xmlToExcel(single_file_path):
w = xlwt.Workbook()
ws = w.add_sheet("DTSExcel")
row=0
style = XFStyle()
#打开xml文档
single_file_path.encode('utf8') #修改编码格式为utf-8
DOM = xml.dom.minidom.parse(single_file_path)
#得到文档元素对象
Data = DOM.documentElement
RowList = Data.getElementsByTagName("Row")
for rows in RowList:
if len(RowList)==0:
continue
DataList =rows.getElementsByTagName('Data')
col=0
for i in range(0,len(DataList)):
if(len(DataList[i].childNodes)==0):
ws.write(row,col,"",style)
else:
ws.write(row,col,DataList[i].firstChild.data,style)
col=col+1
row =row +1
w.save(single_file_path)
print("xmlToExcel "+single_file_path )
return single_file_path