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

Python读取长诗文件遇UnicodeDecodeError,疑因文件长度?

关于UnicodeDecodeError的原因分析与解决方案

嘿,我得先纠正你一个关键误解——这个UnicodeDecodeError完全不是因为文件太大、变量x存不下内容!Python的字符串类型可以轻松处理非常大的文本内容(只要你的内存足够),根本不会因为文件长度触发解码错误。

错误的真正原因

你看到的错误信息:

(result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 43: invalid continuation byte

本质是文件的实际编码和你指定的utf-8不匹配。0xf1这个字节在utf-8编码规则里是不合法的续字节(utf-8的多字节字符有严格的字节范围规则),说明你的长诗文件可能用了其他编码,比如latin-1(ISO-8859-1)、cp1252或者其他地区性编码,而不是utf-8。短文件刚好没有包含这类不符合utf-8规则的字节,所以没触发错误。

解决步骤

  1. 检测文件的实际编码
    可以用Python的chardet库来自动检测文件编码,先安装库:

    pip install chardet
    

    然后用以下代码检测:

    import chardet
    
    with open("poem.txt", 'rb') as f:
        result = chardet.detect(f.read())
        print(result['encoding'])  # 输出文件的实际编码,比如'latin-1'
    
  2. 用正确编码打开文件
    拿到检测出的编码后,修改open函数的encoding参数:

    with open("poem.txt", mode="r", encoding="检测到的编码") as file:
        content = file.read()
        char_count = len(content)
        # 反向打印内容,用切片更简洁高效
        print(content[::-1])
        print(f"字符总数:{char_count}")
    

    (这里推荐用with语句,它会自动帮你关闭文件,避免资源泄漏,比直接open后手动关闭更安全)

  3. 临时兼容方案(不推荐)
    如果暂时无法确定编码,可以用errors参数跳过或替换错误字符,但会丢失部分信息:

    with open("poem.txt", mode="r", encoding="utf-8", errors="replace") as file:
        # errors="ignore"会直接跳过错误字节,"replace"会用�替换
        content = file.read()
    

额外优化:反向打印的更优写法

你之前用递减counter的方式反向打印,其实Python字符串支持直接切片[::-1],一行就能实现反向输出,比手动循环索引简洁得多,效率也更高。

内容的提问来源于stack exchange,提问作者lissethamc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:50:52