Python3中编码与解码之Unicode与bytes的讲解
今天玩Python爬⾍,下载⼀个⽹页,然后把所有内容写⼊⼀个txt⽂件中,出现错误;
TypeError: write() argument must be str, not bytes
AttributeError: 'URLError' object has no attribute 'code'
mssql数据库管理工具UnicodeEncodeError: 'gbk' codec can't encode character ' a0' inposition 5747: illegal multibyte sequence
⼀看就是编码问题,不懂,度娘上⾯这⽅⾯讲得不多,感觉没说清楚,⾃⼰研究了⼀晚上,摸出了⼀点门道。
从头说起,由于各国语⾔⽂字不同,起初要在计算机中表⽰,就有了各种各样的编码(例如中⽂的gb2312)。但是这样就出现了兼容性的问题,所以就有了Unicode,也就是所谓的万国码,python3中字符串类型str就是以Unicode编码格式编码,所以我们在Python3 中看到多种语⾔⽂字的字符串⽽不会出现乱码。
编码是⼀种⽤⼀种特定的⽅式对抽象字符(Unicode)转换为⼆进制形式(bytes)进⾏表⽰,也就是pyt
hon3中的encode。解码就是对⽤特定⽅式表⽰的⼆进制数据⽤特定的⽅式转化为Unicode,也就是decode。
下图就是编码的核⼼:
⼀、字符的编码:
Python对于bites类型的数据⽤带‘b‘前缀的单引号活双引号表⽰。
下⾯关于字符编码解码的代码很好的解释了上⾯的流程图:
s='你好'
print(s)#输出结果:你好
print(type(s))#输出结果:<class 'str'>
在线数据库是什么de('UTF-8')
print(s)#输出结果:b' e4 bd a0 e5 a5 bd'
print(type(s))#输出结果:<class 'bytes'>
s=s.decode('UTF-8')
print(s)#输出结果:你好
print(type(s))#输出结果:<class 'str'>
多说⼀句,如果你对str类型字符进⾏decode会报错,同理,对bytes类型进⾏encode也会报错。
⼆、⽂件编码marquee代码什么意思
在python 3 中字符是以Unicode的形式存储的,当然这⾥所说的存储是指存储在计算机内存当中,如果是存储在硬盘字符串转整型
⾥,Python 3的字符是以bytes形式存储,也就是说如果要将字符写⼊硬盘,就必须对字符进⾏encode。对上⾯这段话再解释⼀下,如果要将str写⼊⽂件,如果以‘w'模式写⼊,则要求写⼊的内容必须是str类型;如果以‘wb'形式写⼊,则要求写⼊的内容必须是bytes类型。⽂章开头出现的集中错误,就是因为写⼊模式与写⼊内容的数据类型不匹配造成的。
s1 = '你好'
#如果是以‘w'的⽅式写⼊,写⼊前⼀定要进⾏encoding,否则会报错
with open('F:\\1.txt','w',encoding='utf-8') as f1:
f1.write(s1)
s2 = s1.encode("utf-8")#转换为bytes的形式
python在线编辑器python3#这时候写⼊⽅式⼀定要是‘wb',且⼀定不能加encoding参数
with open('F:\\2.txt','wb') as f2:
f2.write(s2)
有的⼈会问,我在系统⾥⾯⽤⽂本编辑器打开以bytes形式写⼊的2.txt⽂件,发现⾥⾯显⽰的是‘你好',⽽不是‘b' e4 bd a0 e5 a5 bd'',因为⽂本⽂档打开2.txt时,⼜会对它进⾏decode,然后才给你看到。
三、⽹页的编码delete all user data是什么意思
⽹页编码和⽂件编码⽅法差不多,如下urlopen下载下来的⽹页read()且⽤decoding(‘utf-8')解码,那就必须以‘w'的⽅式写⼊⽂件。如果只是read()⽽不⽤encoding(‘utf-8')进⾏编码,⼀定要以‘wb'⽅式写⼊:
以‘w'⽅式写⼊时:
response= url_open('www.jb51/article/157034.htm ' ,timeout=5 )
#此处以UTF-8⽅式进⾏解码,解码后的数据以unicode的⽅式存储在html中
html = ad().decode('UTF-8')
print(type(html))#输出结果:<class 'str'>
#这时写⼊⽅式⼀定要加encoding,以encoding
# 即UTF-8的⽅式对⼆进制数据进⾏编码才能写⼊
with open('F:\',"w" , encoding='UTF-8') as f:
f.write(html)
以‘wb'⽅式写⼊:
response= url_open('www.jb51/article/157034.htm ' ,timeout=5 )
html = ad()#此处不需要进⾏解码,下载下来
print(type(html))#输出结果:<class 'bytes'>
with open('F:\',"wb" ) as f:
f.write(html)
如果要在Python3中,对urlopen下来的⽹页进⾏字符搜索,肯定也要进⾏decode,例如使⽤就必须进⾏decode。总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。如果你想了解更多相关内容请查看下⾯相关链接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论