随笔记之Python2与Python3编码小别

来源:互联网 发布:java 16进制颜色转rgb 编辑:程序博客网 时间:2024/05/01 16:50

今天在写爬虫代码爬取网页时,遇到了一个有关Python编码的问题。通过这个问题,发现了一个Python3的优势,或者说是长处。
在处理同样的事务时,同样的文字,Python2需要额外加一些处理。
比如:
两段代码都含有这句话开头

#-*- coding:utf-8 -*-

在使用selenium库中的send_keys(key) 方法时,如果key为汉字,Python2中需要在key前加“u”来做处理,如,u”开心”,而Python3则不需要做任何处理。
Python2中如果不做处理,会出现如下错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 0: unexpected end of data

还有在写文件时,同样会出现一些编码问题。
当我使用Python2往一个文件中写如爬取的网页的源码时,出现如下错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 174-178: ordinal not in range(128)

寻找解决方案时,有许多说法,在尝试使用这些方法解决问题时,发现了一个Python2与Python3有差异的地方。
在Python2下此问题的解决办法为:

import sysreload(sys)sys.setdefaultencoding("utf-8")

有说使用f = open("xxx.txt", "w", encoding="utf-8") 来解决此问题,可是却会报出SyntaxError: invalid syntax 错误。
其实后一个解决方案是python3适用的解决办法,在搜解决方案时,有些博主没有说明,使自己对问题感觉莫名其妙。

在这个问题上,我还尝试使用python2的解决方案来解决python3的问题,却报出NameError: name 'reload' is not defined 的错误。查找资料发现,python3把reload()方法封装到imp模块中,如果使用需要提取引用from imp import reload。引入reloa 之后,又报出AttributeError: module 'sys' has no attribute 'setdefaultencoding' 属性错误。很明显这个解决方案不可行。

总的来说,感觉python3在细节上处理的更好了,对程序员更友善,需要考虑的细节少了。

原创粉丝点击