美文网首页
【报错】UnicodeDecodeError: 'utf-8'

【报错】UnicodeDecodeError: 'utf-8'

作者: elephantnose | 来源:发表于2019-10-18 15:31 被阅读0次

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

    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'

          本文链接:https://www.haomeiwen.com/subject/nwgimctx.html