前言
很早之前就知道python2官方快要不支持了,今年自己终于也要将python2写的code逐步转成python3,这里开始记录一些转移的笔记。
官方自带工具转换
$ 2to3 (按tab键自动补全)
2to3 2to3- 2to3-2.7 2to3-3.7
这里我使用的是2to3-3.7将Python2.X代码转换成Python3.X
- 转换单个文件
$ 2to3-3.7 -w 1.py
- 转换文件夹下的文件
$ 2to3-3.7 -w ./dir
补充说明:
- 以上命令建议只执行一次,不要多次执行。
- 这个工具只能解决大部分问题,部分代码需要自己修改。
转换成Python3一些记录
- 如何兼容python2和python3代码,根据版本来决定。
python3执行
>>> import sys
>>> sys.version_info.major
3
python2执行
>>> import sys
>>> sys.version_info.major
2
- 解决:UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 32-33
使用Python的第三方库requests发起post请求时,有时会遇到由于post所携带的数据的编码问题,导致请求失败,这时我们就需要改变编码格式。
r = requests.post(url, headers=headers, data=data)
改成
r = requests.post(url, headers=headers, data=data.encode('utf-8'))
- 关于解决'\u'开头的字符串转中文的方法
python3的解决办法:
字符串.encode('utf-8').decode('unicode_escape')
python2:
字符串.decode('unicode_escape')
- AttributeError: module 'sys' has no attribute 'setdefaultencoding'
python2:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
用官方工具转换后
python3:
import sys
import imp
imp.reload(sys)
sys.setdefaultencoding("utf-8")
一执行就会报错:
$ python3 1.py
Traceback (most recent call last):
File "1.py", line 5, in <module>
sys.setdefaultencoding("utf-8")
AttributeError: module 'sys' has no attribute 'setdefaultencoding'
原因:
Python3字符串默认编码unicode, 所以sys.setdefaultencoding也不存在了
-bash-4.1$ export LC_ALL=C
-bash-4.1$ python3 -c 'import sys; print(sys.stdout.encoding)'
ANSI_X3.4-1968
-bash-4.1$ export LC_ALL=en_US.UTF-8
-bash-4.1$ python3 -c 'import sys; print(sys.stdout.encoding)'
UTF-8
-bash-4.1$ export LC_ALL=
-bash-4.1$ python3 -c 'import sys; print(sys.stdout.encoding)'
UTF-8