Python3中编码与解码之Unicode与bytes的讲解

 更新时间:2019年02月28日 17:24:29   作者:奥辰_  
今天小编就为大家分享一篇关于Python3中编码与解码之Unicode与bytes的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

今天玩Python爬虫,下载一个网页,然后把所有内容写入一个txt文件中,出现错误;

TypeError: write() argument must be str, not bytes
AttributeError: 'URLError' object has no attribute 'code'
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' inposition 5747: illegal multibyte sequence

一看就是编码问题,不懂,度娘上面这方面讲得不多,感觉没说清楚,自己研究了一晚上,摸出了一点门道。

从头说起,由于各国语言文字不同,起初要在计算机中表示,就有了各种各样的编码(例如中文的gb2312)。但是这样就出现了兼容性的问题,所以就有了Unicode,也就是所谓的万国码,python3中字符串类型str就是以Unicode编码格式编码,所以我们在Python3 中看到多种语言文字的字符串而不会出现乱码。

编码是一种用一种特定的方式对抽象字符(Unicode)转换为二进制形式(bytes)进行表示,也就是python3中的encode。解码就是对用特定方式表示的二进制数据用特定的方式转化为Unicode,也就是decode。

下图就是编码的核心:

一、字符的编码:

Python对于bites类型的数据用带‘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类型字符进行decode会报错,同理,对bytes类型进行encode也会报错。

二、文件编码

在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的形式
#这时候写入方式一定要是‘wb',且一定不能加encoding参数
with open('F:\\2.txt','wb') as f2:
  f2.write(s2)

有的人会问,我在系统里面用文本编辑器打开以bytes形式写入的2.txt文件,发现里面显示的是‘你好’,而不是‘b'\xe4\xbd\xa0\xe5\xa5\xbd'’,因为文本文档打开2.txt时,又会对它进行decode,然后才给你看到。

三、网页的编码

网页编码和文件编码方法差不多,如下urlopen下载下来的网页read()且用decoding(‘utf-8’)解码,那就必须以‘w’的方式写入文件。如果只是read()而不用encoding(‘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’方式写入:

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下来的网页进行字符搜索,肯定也要进行decode,例如使用lxml.etree就必须进行decode。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Python面向对象编程中关于类和方法的学习笔记

    Python面向对象编程中关于类和方法的学习笔记

    类与类方法是面向对象的编程语言中必不可少的特性,本文总结了Python面向对象编程中关于类和方法的学习笔记,需要的朋友可以参考下
    2016-06-06
  • Python3之字符串比较_重写cmp函数方式

    Python3之字符串比较_重写cmp函数方式

    这篇文章主要介绍了Python3之字符串比较_重写cmp函数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Python中比较两个字符串操作实例深究

    Python中比较两个字符串操作实例深究

    本文深入探讨Python中字符串比较的多种方法,并通过丰富的示例代码演示如何灵活运用这些技巧,从基本的相等性检查到更高级的正则表达式模式匹配,读者将了解如何利用Python强大的字符串处理功能,提高对字符串数据的操作技能,以解决日常编程任务中的挑战
    2023-12-12
  • Python实时监控网站浏览记录实现过程详解

    Python实时监控网站浏览记录实现过程详解

    这篇文章主要介绍了Python实时监控网站浏览记录实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Python常用数据结构和公共方法技巧总结

    Python常用数据结构和公共方法技巧总结

    这篇文章主要介绍了Python常用数据结构和公共方法技巧总结,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • python中cv2模块安装详细图文教程

    python中cv2模块安装详细图文教程

    在Python中cv2是OpenCV库的一个模块,这是一个开源的计算机视觉和机器学习软件库,下面这篇文章主要给大家介绍了关于python中cv2模块安装的相关资料,需要的朋友可以参考下
    2024-05-05
  • python绘制玫瑰花情人节表白

    python绘制玫瑰花情人节表白

    这篇文章主要介绍了python绘制玫瑰花,文章基于python的相关资料展开主题详细介绍,具有一定的参考价值,想情人节花式表白的小伙伴可以参考一下哟
    2022-06-06
  • 详解爬虫被封的问题

    详解爬虫被封的问题

    这篇文章主要介绍了爬虫被封的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • python实现用户管理系统

    python实现用户管理系统

    这篇文章主要为大家详细介绍了python实现用户管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python闭包之返回函数的函数用法示例

    Python闭包之返回函数的函数用法示例

    这篇文章主要介绍了 Python闭包之返回函数的函数用法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01

最新评论