#Python3中os中编码encode与decode 解码

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转换为其字符串形式

  1. 遇到类似的编码问题时,先检查响应内容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


版权声明:本文为weixin_43097301原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。