【报错】UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 3652: invalid continuati...

今天读取文件数据时遇到了一个编解码的问题:

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 :
        ...

大功告成

你可能感兴趣的:(【报错】UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 3652: invalid continuati...)