今天读取文件数据时遇到了一个编解码的问题:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 3652: invalid continuation byte
通常情况下, 读取文件时如果不指定编码类型, 编码类型将跟随系统, 如:
with open("file") as fr:
for line in fr:
...
他的编码类型跟随系统, 使用 locale
命令查看编码:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
一般linux系统的默认编码格式为 utf-8
, windows系统的默认编码格式为 GBK
但是当一个文件存在两种及以上的编码格式时, 用一种编码格式读取文件就会发生上述错误
解决办法为将文件流用 io
模块的 TextIOWrapper
进行封装, 指定一种编码格式并忽略其他编码格式即可, 将上面代码改为:
import io
with open("file") as fr:
input_stream = io.TextIOWrapper(fr.buffer, encoding='utf-8', errors='replace')
for line in input_stream :
...
大功告成