Python2转Python3

前言

很早之前就知道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

补充说明:

  1. 以上命令建议只执行一次,不要多次执行。
  2. 这个工具只能解决大部分问题,部分代码需要自己修改。

转换成Python3一些记录

    1. 如何兼容python2和python3代码,根据版本来决定。

python3执行

>>> import sys
>>> sys.version_info.major
3

python2执行

>>> import sys
>>> sys.version_info.major
2
    1. 解决: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'))
    1. 关于解决'\u'开头的字符串转中文的方法

python3的解决办法:

字符串.encode('utf-8').decode('unicode_escape')

python2:

字符串.decode('unicode_escape')
    1. 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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容