Code前端首页关于Code前端联系我们

Python3编解码Unicode和字节解释

terry 2年前 (2023-09-25) 阅读数 181 #后端开发

玩一个Python爬虫,下载一个网页,将所有内容写入txt文件,有错误;

TypeError:write() 参数必须是 str,而不是 bytes
AttributeError:对象“URLError”没有属性“code”
UnicodeEncodeError:“gbk”编解码器“\5047”字符“\5047”:非法多字节序列

乍一看,这是一个编码问题。我不明白。对于以上方面,度娘并没有多说,他也觉得没有解释清楚。他研究了一晚上,思考了一会儿。

让我们从头开始吧。由于不同国家的语言和文字不同,导致电脑上显示的编码不同(如中文gb2312)。但它会导致兼容性问题,所以就有了Unicode,也就是所谓的通用码。 python3中的字符串类型str是采用Unicode编码格式进行编码的,所以我们在Python3中看到很多语言的字符串都不会出现乱码。

解码是一种将抽象字符(Unicode)转换为二进制格式(字节)进行表示的特殊方式,用python3编码。转换是指将以特定方式表示的二进制数据以特定方式转换为Unicode,即解码。

下图是净化的基础:

1。字符操作:

Python 使用单字或带有“b”后缀的双字来表示一口大小的数据。

下面的字符编码转换代码很好的解释了上面的流程图:

s='你好'
print(s)#输出结果:你好
print(type(s))#输出结果:<class 'str'>
s=s.encode('UTF-8')
print(s)#输出结果:b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(type(s))#输出结果:<class 'bytes'>
s=s.decode('UTF-8')
print(s)#输出结果:你好
print(type(s))#输出结果:<class 'str'>

还有一点,如果转换str字符,会报错。同样,如果您编码字节类型,也会显示错误。

2。文件编码

在Python 3中,字符以Unicode格式存储。当然,这里所说的存储是指计算机内存中的存储。如果存储在硬盘上,Python 3中的字符是Unicode格式的,它是以字节为单位存储的,这意味着如果要向硬盘写入字母,就必须对字符进行编码。重新解释一下上面这行,如果要将str写入文件,如果以'w'模式写入,写入的内容必须是str类型;如果以'wb'格式写入,则必须写入内容必须是字节类型。文章开头出现的累积错误是由于写作风格和写作内容数据类型的差异造成的。

s1 = '你好'
#如果是以‘w'的方式写入,写入前一定要进行encoding,否则会报错 
with open('F:\\1.txt','w',encoding='utf-8') as f1:
  f1.write(s1)
s2 = s1.encode("utf-8")#转换为bytes的形式
#这时候写入方式一定要是‘wb',且一定不能加encoding参数
with open('F:\\2.txt','wb') as f2:
  f2.write(s2)

有人会问,我用文本编辑器打开系统中以字节写入的2.txt文件,发现显示的是‘Hello’,而不是‘b’\xe4\xbd\xa0\xe5\xa5 \xbd'',因为当你打开2.txt文件时,它会在你看到它之前被读取。

3。网页覆盖率

网页排序和文件格式也是如此。如下所示,如果通过urlopen下载的网页被read()并通过decode('utf-8')解码,则文件必须以'w'格式写入。如果你 read() 没有编码 ('utf-8'),则必须以 'wb' 风格书写:

以 'w' 风格书写时:

response= url_open('https://www.jb51.net/article/157034.htm ' ,timeout=5 )
#此处以UTF-8方式进行解码,解码后的数据以unicode的方式存储在html中
html = response.read().decode('UTF-8')
print(type(html))#输出结果:<class 'str'>
#这时写入方式一定要加encoding,以encoding
# 即UTF-8的方式对二进制数据进行编码才能写入
with open('F:\DownloadAppData\html.txt',"w" , encoding='UTF-8') as f:
  f.write(html)

以 'wb' 风格书写 wb' :

response= url_open('https://www.jb51.net/article/157034.htm ' ,timeout=5 )
html = response.read()#此处不需要进行解码,下载下来
print(type(html))#输出结果:<class 'bytes'>
with open('F:\DownloadAppData\html.txt',"wb" ) as f:
  f.write(html)

如果你想在Python3中对从urlopen下载的网页进行字符搜索,你也必须对其进行转换。例如,如果您使用lxml.etree,则必须对其进行转换。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门