Python 2.7.9使用xlwt保存Excel时遇UnicodeDecodeError求助
嘿,我来帮你解决这个Unicode解码的问题!你遇到的这个UnicodeDecodeError本质是xlwt在生成Excel的时候,默认用ASCII去处理字符串,但你的文本里有非ASCII的特殊字符(比如错误里的0xc3,大概率是UTF-8里的带重音字符,像ñ这类),而且你之前设置的sys.setdefaultencoding('utf8')其实管不到xlwt内部的编码逻辑。另外你的脚本还有个隐藏小坑——文件路径处理不对,导致你可能根本没读到目标目录下的文件,我一起给你补上!
下面是修复后的完整脚本,我标了核心修改点:
#!/usr/bin/env python # encoding=utf8 import xlwt import os import sys import codecs # 新增:用来指定编码打开文件,避免乱码 reload(sys) sys.setdefaultencoding('utf8') # 新增:创建Workbook时指定UTF-8编码,告诉xlwt用UTF-8处理字符串 wb = xlwt.Workbook(encoding='utf-8') path = "/home/Final_analysis/" lis = os.listdir(path) sheetnumber = 1 for x in lis: # 关键:拼接完整文件路径,不然os.isfile会在当前脚本目录找文件,不是目标目录 file_path = os.path.join(path, x) if os.path.isfile(file_path): extension = os.path.splitext(x) if extension[1] == '.txt': ws = wb.add_sheet(extension[0]) row = 0 # 关键:用codecs以UTF-8编码打开文件,直接读取成Unicode字符串 with codecs.open(file_path, 'r', 'utf-8') as a: # 换成for循环读取每一行,比while True更简洁 for a1 in a: # 去掉末尾的换行符,避免写入单元格时带多余换行 a1 = a1.strip('\n') if not a1: continue # 用\t代替制表符转义,代码更清晰 data = a1.split("\t") column = 0 for z in data: # 保险起见:如果是字节串,就转成Unicode对象 if isinstance(z, str): z = z.decode('utf-8') ws.write(row, column, z) column += 1 row += 1 sheetnumber += 1 wb.save("Ronic.xls")
核心修改说明:
- 指定Workbook编码:创建
xlwt.Workbook时加上encoding='utf-8',直接告诉xlwt用UTF-8处理所有字符串,不再用默认的ASCII。 - 修复文件路径:用
os.path.join把目标目录和文件名拼起来,确保你操作的是/home/Final_analysis/下的文件,而不是脚本所在目录。 - 编码读取文件:用
codecs.open指定UTF-8编码读取文本,直接拿到Unicode字符串,从根源避免解码错误。 - 字符串类型校验:确保写入Excel的是Unicode对象,就算有遗漏的字节串,也会转成Unicode再写入。
至于你之前试的sys.setdefaultencoding('utf8')为啥没用?因为Python2的这个全局设置只是改了字符串默认转换规则,但xlwt内部有自己的编码处理逻辑,它不会继承这个全局设置,所以必须直接给它传Unicode字符串,或者指定Workbook的编码。
你运行修改后的脚本应该就能解决保存时的错误了,顺便也能正确读取目标目录下的所有txt文件~
内容的提问来源于stack exchange,提问作者RonicK
相关产品推荐
相关产品推荐

