python怎样看字符unicode编码(Python3中编码与解码之Unicode与bytes的讲解)
python怎样看字符unicode编码
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( 'http://www.zzvips.com/article/167971.html ' ,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( 'http://www.zzvips.com/article/77800.html ' ,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。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/chb4715/article/details/79104299
- python中encode中文自定义编码(详解Python解决抓取内容乱码问题decode和encode解码)
- mysql命令输入行在哪(MySQL命令行操作时的编码问题详解)
- 创建jsp时如何默认生成的是utf-8(js判断文件是否为utf-8编码的方法)
- apache错误编码代码(关于Apache默认编码错误 导致网站乱码的解决方案)
- mysql编码设置
- html中的特殊符号编码
- 什么是mime编码(Mime类型与文件后缀对照表)
- python怎样看字符unicode编码(Python3中编码与解码之Unicode与bytes的讲解)
- css的字体大全(CSS 常用中文字体 Unicode 编码表)
- URL如何编码与解码
- python对于gbk处理(Python 2/3下处理cjk编码的zip文件的方法)
- dede编码在哪里改(dede栏目页面包屑导航最后的分隔符大于号去掉方法)
- url编码及解码(伪静态URL中文乱码问题解决方法)
- python的编码方式(Python中文编码知识点)
- pythonrequest包设置编码(解决python3中的requests解析中文页面出现乱码问题)
- mysql字段多有什么问题(MySQL编码不一致可能引起的一些问题)
- 马来西亚旅游攻略(马来西亚旅游攻略自由行攻略)
- 缅甸旅游攻略(缅甸旅游攻略必去景点推荐)
- 《庆余年2》新消息,原班人马,肖战特别出演,这才是最好的安排(庆余年2新消息原班人马)
- 宁夏灵武恐龙化石发现始末(宁夏灵武恐龙化石发现始末)
- 到了岁末 临门一脚 节点,天台综合督评会目标直指 全年红(到了岁末临门一脚)
- 寒假余额不满24小时,不如来一场说走就走的亲子阅读之旅(寒假余额不满24小时)
热门推荐
- python把文件上传服务器(Python 实现两个服务器之间文件的上传方法)
- laravel 数据库实现原理(laravel 数据迁移与 Eloquent ORM的实现方法)
- css怎么给背景颜色设置模糊(CSS设置背景图片模糊内容不模糊的解决方法)
- SQL Server中使用order by charindex按指定顺序排序
- 阿里云ecs所有文件备份到本地(阿里云ECS服务器的系统重装、快照备份、恢复数据回滚教程)
- vs连接sql语句(vs code连接sql server数据库步骤及遇到的问题小结)
- sqlserver2000显示无服务器(SQL SERVER 2000 9003错误的解决方法只适用于SQL2000)
- harbor镜像仓库扫描原理(Harbor搭建Docker私有仓库的实现方法)
- mysql8.0.23.0官方安装手册(MySQL8.0.23安装超详细教程)
- dedecms模板特点(在Dedecms下面生成Google Sitemap的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9