Python读取文本文件无法识别“–”字符报UnicodeDecodeError问题问询
问题1:为什么仅指定encoding=utf-8时才报错
你的认知存在偏差:Python内置open()函数的默认编码不是固定为UTF-8,默认编码取值为运行环境的系统区域偏好编码,可通过locale.getpreferredencoding(False)查看,比如Windows中文环境默认编码通常为cp936,欧美环境常为cp1252。
你遇到的0x96字节正好是cp1252编码下短破折号–的合法编码值,所以当你不指定encoding参数时,系统用默认的cp1252/cp936解码该字节不会报错;而0x96不属于UTF-8编码的合法单字节字符,也不是多字节字符的合法起始字节,所以显式指定encoding=utf-8时会触发解码错误。
问题2:写文件阶段的修复方案
不需要修改读取逻辑,仅在写入文件时做以下任意一种调整即可修复:
- 方案1:写入时显式指定UTF-8编码
打开待写入的文件时显式传入encoding='utf-8'参数,保证所有字符都以UTF-8标准编码存储,示例代码:
这种方式写入的文件完全符合UTF-8标准,后续读取时指定# 写入阶段代码 with open("output.txt", "w", encoding="utf-8") as f: f.write(你从API拿到的文本内容)encoding=utf-8不会触发编码错误。 - 方案2:写入时对齐读取端的默认编码
先在读取程序的运行环境执行以下代码拿到默认编码:
写入文件时指定为该编码即可保证编解码完全匹配,哪怕读取端不指定encoding参数也不会出现任何报错。import locale print(locale.getpreferredencoding(False)) - 补充兼容方案:如果存在无法识别的异常字符,可在写入时添加
errors='replace'参数,将异常字符替换为�占位符避免写入失败,示例:with open("output.txt", "w", encoding="utf-8", errors="replace") as f: f.write(文本内容)
内容的提问来源于stack exchange,提问作者Aniket Tiratkar
相关产品推荐
相关产品推荐

