You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:22:46