21.编码encode
import os #导入os 库
path = "C:\\Users\\Administrator\\Desktop\\新建文本文档.txt"
with open(path,"wb") as f1:
f1.write(b"sunck is a good boy")
相当于
with open(path,"wb") as f1:
str = "sunck is a good boy"
f1.write(str.encode("utf-8"))
with open(path,"wb",encoding="utf-8") as f1:
#通过字节方式写入文件的时候,传给Python的必须是字节数据,否则就会报错:
#ValueError: binary mode doesn't take an encoding argument
22.decode 解码
import os #导入os 库
with open(path,"w",encoding="utf-8") as f3:
str = "sunck is a good boy萨a德"
f3.write(str)
with open(path,"r",errors= "ignore") as f4: #不写errors= "ignore" 此处也没报错
data = f4.read()
print(data)
print(type(data))
编码和解码
从本质上来说,编码和解码就是Python中str和bytes这两种字符串类型之间的互相转换。, str包含一个encode方法,使用特定编码将该字符串其转换为一个bytes,这称之为编码。 bytes类包含了一个decode方法,也接受一个编码作为单个必要参数,并返回一个str,这称之为解码。这种转换操作是显式的操作,且必须根据数据被编码时采用的编码类型进行解码。
python3似乎对一切的unicode都那么的友好,当一个字符串里存在unicode的时候,只要字符串是硬编码的,就可以转换成中文打印在控制台上,但是,假如你。。的这段含有‘\u’的unicode编码不是硬编码进脚本的,而是通过requests在网上爬的。。。那么你会发现,你打印出来的,还是长这样的unicode编码,换句话说,解释器这个时候根本就没认出这东西原来是unicode编码,当成普通的字符序列了。
Python 3.X带有3种字符串对象类型——一种用于文本数据,两种用于二进制数据:
str表示Unicode文本(8位的和更宽的)
bytes表示二进制数据
bytearray,是一种可变的bytes类型’’’
在使用python3的requests模块时,
发现获取响应有两种方式:(r表示response响应内容)
其一,为文本响应内容, r.text
其二,为二进制响应内容,r.content
r.text实际上就是Unicode的响应内容,而r.content是二进制的响应内容,
r.text方法返回的是用unicode编码的响应内容。响应内容的编码取决于HTTP消息头,如果你有HTTP之外的知识来猜测编码,你应该在访问这个属性之前设置合适的r.encoding,也就是说,你可以用r.encoding来改变编码,这样当你访问r.text ,Request 都将会使用r.encoding的新值
解决的办法就是unicode_escape
print(res.content.decode("unicode_escape"))
总结
str包含一个encode方法,使用特定编码将该字符串其转换为一个bytes,这称之为编码。 bytes类包含了一个decode方法,也接受一个编码作为单个必要参数,并返回一个str,这称之为解码。
str.encode() 把一个字符串转换为其 bytes形式
bytes.decode() 把 bytes转换为其字符串形式
- 遇到类似的编码问题时,先检查响应内容text是什么类型,
如果type(text) is bytes,那么
text.decode(‘unicode_escape’)
如果type(text) is str,那么
text.encode(‘unicode_escape’).decode(‘unicode_escape’)
参考知乎:https://www.zhihu.com/question/26921730
https://www.cnblogs.com/cnhkzyy/p/9092644.html