Python 读取文件时的 UnicodeDecodeError

作者: , 共 1086 字 , 共阅读 0

在 Python 中操作文件或字符串时,有时候会碰到 UnicodeDecodeError 异常:

  File "/usr/lib/python3.8/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in position 415632: 
invalid continuation byte

当然,最开始需要检查的是编码是否符合文本自己的编码。目前默认编码都是utf8,有时候我们需要指定编码为中文编码:

file = open(path, encoding="gbk")
b = s.encode(encoding="gbk")
s = b.decode(encoding="gbk")

但即使这样,有些文本还是会抛出 UnicodeDecodeError 错误,这是因为文件或者原来的二进制字节码本身就有错误,出现最多的情况是字节码被中间截断(比如一个中文有三个字节码,但因为某种原因最后一个字节码丢失了)。这时候我们需要用到errors参数。

该参数属于codecs, Python 的编码库和基类。open 函数, 字符串都使用了该编码器,因此都支持errors参数。该参数支持下面三个取值:

含义
'strict' 出错时会抛出 UnicodeError。这也是该参数的默认值。
'ignore' 忽略错误格式的数据并且不加进一步通知就继续执行。用户完全无法察觉。
'replace' 使用适当的替换标记进行替换。出错时不会通知,不会抛出异常。但解码后的结果里会包含方块问号,提示这里有错误。

所以要想忽略编码问题,最佳方式是:

file = open(path, encoding="gbk", errors="replace")
b = s.encode(encoding="gbk", errors="replace")
s = b.decode(encoding="gbk", errors="replace")

Q. E. D.

类似文章:
最近老遇到一个奇怪的问题。在 VS 2013 编译时,爆出很多警告:
编程 » Linux, Vim, 字符编码
由于 UNICODE 的优势,目前推荐都用 UTF-8 进行编码。
编程 » Python
今天写一段程序时遇到一个问题,查了好一会才搞清楚。代码可以简化为下面这个小代码:
编程 » Python
在 Python3 以上,通常说的字符串是指unicode字符串,以下将不再重复强调。
编程 » Python
在 Python 中,有时候为了获取当前运行的脚本的同目录下的另外一个文件,会这么写:
Pyhon 的抽象基类( abstruct base class )库abc定义了类似于 C++的纯虚函数的功能:
编程 » python, 单元测试
unittest 是 python 官方的单元测试工具。最近发现一个之前没注意到的盲区:
一定要先座这一几步,否则直接用pypyodbc会爆下面错误:
IT » Python, Ubuntu
主要是update-alternatives命令的使用。
Python 数据分析工具 pandas 中以 DataFrame 和 Series 作为主要的数据结构。
从东门出发的 10 公里大环线,南线上到高压线塔,后山山脊下到上方寺遗址,再从北线飞来石塔下山。总路程接近 10 公里,爬升接近 1000 米。
IT » gnu, Linux
简单列一些 Linux 自带的 GNU 命令的常用用法,可以当做 cheatsheet 使用。