关于Python中中文文本文件使用二进制方式读取后的解码UnicodeDecodeError问题

最近老猿在进行文件操作的验证测试,发现对于中文文本文件如果使用二进制方式打开,返回的类型是bytes,如果要转换成可读的字符串信息需要进行解码。可是老猿使用decode()或decode("UTF-8")解码后报错:
Traceback (most recent call last):
File "", line 3, in
print("line.decode():",line.decode())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte
在网上查了一下,发现给出的解决方法复杂还不容易理解。老猿认为这就是个字符集编码的问题,但以前老猿没有学习过字符集编码的相关知识,于是在网上查了相关的资料,具体请见老猿转载的几篇文章:
1、《转:使用DOS命令chcp查看windows操作系统的默认编码以及编码和语言的对应关系》;
2、转:浅析windows下字符集和文件编码存储/utf8/gbk
3、《转1:Python字符编码详解》
4、《转2:Python字符编码详解》
5、《转:Python常见字符编码及其之间的转换》

通过以上几篇文章的学习,老猿确认了是由于操作系统默认字符集是'GBK'而不是'UTF-8'导致的,因此文件存储后的编码也是GBK,则解码时调用decode('GBK')或decode('GB2312')就可以解决。
案例:

>>> fp = open(r"c:\temp\test.txt","rb")
>>> for line in fp:
    print("line:",line)
    try:print("line.decode():",line.decode())
    except:print("line.decode() error")
    try:print("line.decode('UTF-8'):",line.decode())
    except:print("line.decode('UTF-8') error")
    print("line.decode('gbk'):",line.decode('GBK'))
    print("line.decode('gb2312'):",line.decode('GB2312'))

    
line: b'\xb3\xfc\xd6\xdd\xce\xf7\xbd\xa7\r\n'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 滁州西涧


line.decode('gb2312'): 滁州西涧


line: b'[\xcc\xc6] \xce\xa4\xd3\xa6\xce\xef\r\n'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): [唐] 韦应物


line.decode('gb2312'): [唐] 韦应物


line: b'\xb6\xc0\xc1\xaf\xd3\xc4\xb2\xdd\xbd\xa7\xb1\xdf\xc9\xfa\xa3\xac\xc9\xcf\xd3\xd0\xbb\xc6\xf0\xbf\xc9\xee\xca\xf7\xc3\xf9\xa1\xa3\r\n'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 独怜幽草涧边生,上有黄鹂深树鸣。


line.decode('gb2312'): 独怜幽草涧边生,上有黄鹂深树鸣。


line: b'\xb4\xba\xb3\xb1\xb4\xf8\xd3\xea\xcd\xed\xc0\xb4\xbc\xb1\xa3\xac\xd2\xb0\xb6\xc9\xce\xde\xc8\xcb\xd6\xdb\xd7\xd4\xba\xe1\xa1\xa3'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 春潮带雨晚来急,野渡无人舟自横。
line.decode('gb2312'): 春潮带雨晚来急,野渡无人舟自横。
>>>

老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!

你可能感兴趣的:(关于Python中中文文本文件使用二进制方式读取后的解码UnicodeDecodeError问题)