最近老猿在进行文件操作的验证测试,发现对于中文文本文件如果使用二进制方式打开,返回的类型是bytes,如果要转换成可读的字符串信息需要进行解码。可是老猿使用decode()或decode(“UTF-8”)解码后报错:
Traceback (most recent call last):
File “
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: emp est.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'xb3xfcxd6xddxcexf7xbdxa7
'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 滁州西涧
line.decode('gb2312'): 滁州西涧
line: b'[xccxc6] xcexa4xd3xa6xcexef
'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): [唐] 韦应物
line.decode('gb2312'): [唐] 韦应物
line: b'xb6xc0xc1xafxd3xc4xb2xddxbdxa7xb1xdfxc9xfaxa3xacxc9xcfxd3xd0xbbxc6xf0xbfxc9xeexcaxf7xc3xf9xa1xa3
'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 独怜幽草涧边生,上有黄鹂深树鸣。
line.decode('gb2312'): 独怜幽草涧边生,上有黄鹂深树鸣。
line: b'xb4xbaxb3xb1xb4xf8xd3xeaxcdxedxc0xb4xbcxb1xa3xacxd2xb0xb6xc9xcexdexc8xcbxd6xdbxd7xd4xbaxe1xa1xa3'
line.decode() error
line.decode('UTF-8') error
line.decode('gbk'): 春潮带雨晚来急,野渡无人舟自横。
line.decode('gb2312'): 春潮带雨晚来急,野渡无人舟自横。
>>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
老猿Python,跟老猿学Python!
博客地址:http://iyenn.com/index/link?url=https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!



评论记录:
回复评论: