Python读取长诗文件遇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规则的字节,所以没触发错误。
解决步骤
检测文件的实际编码
可以用Python的chardet库来自动检测文件编码,先安装库:pip install chardet然后用以下代码检测:
import chardet with open("poem.txt", 'rb') as f: result = chardet.detect(f.read()) print(result['encoding']) # 输出文件的实际编码,比如'latin-1'用正确编码打开文件
拿到检测出的编码后,修改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后手动关闭更安全)临时兼容方案(不推荐)
如果暂时无法确定编码,可以用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

