ls *.py|xargs -i 2to3 -w {}
如何把Python2的代码转换为Python3的代码
如果对于python2和python3不熟悉的,可以参考:
【整理】总结Python2(Python 2.x版本)和Python3(Python 3.x版本)之间的区别
之前有机会接触到,将Python2的代码转换为Python3的代码。
经过一番折腾,大概有了基本概念了。
现在简要整理一下,关于如何将Python 2.x的代码,转换为Python 3.x的代码。
把Python 2.x的代码转换为Python 3.x代码的方法
1.自己手动转换
这个不必多说,如果只是涉及很少的函数,比如print等。
那么自己改改代码,也就可以了。
2.利用Python内置(Python脚本)工具,帮你自动转换
Python 2.x版本,比如我安装的Python 2.7.2,其在windows下载安装好之后,就自带了相关的一些有用的工具。
其中一个叫做2to3.py,就是用来帮你实现,将Python 2.x的代码,转换为Python 3.x的代码的。
其位置位于:Python安装的根目录Python27ToolsScripts2to3.py
【如何利用2to3.py,实现将Python 2.x的代码,转换为Python 3.x的代码】
比如我手上有个Python 2.x的python脚本:
D: mp mp_dev_rootpythonpython2_to_python334563264_data_from_site.py
现在,想要将其转换为Python 3.x的代码。
可以通过打开windows的cmd,定位至该要转换的脚本下,然后运行
D: mpWordPressDevRootPython27ToolsScripts2to3.py -w 34563264_data_from_site.py
即可成功转换,对应的执行结果为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
D: mp mp_dev_rootpythonpython2_to_python3>D: mpWordPressDevRootPython27ToolsScripts2to3.py -w 34563264_data_from_site.py RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma RefactoringTool: Refactored 34563264_data_from_site.py --- 34563264_data_from_site.py (original) +++ 34563264_data_from_site.py (refactored) @@ -18,7 +18,7 @@ import time ; import codecs; import logging; - import urllib; + import urllib.request, urllib.parse, urllib.error; from datetime import datetime,timedelta; from optparse import OptionParser; from string import Template,replace; @@ -90,7 +90,7 @@ foundPhone = eachItemSoup. find (attrs={ "class" : "phone" }); logging.debug( "foundPhone=%s" , foundPhone); if (foundPhone): - foundPhoneUni = unicode(foundPhone); + foundPhoneUni = str(foundPhone); logging.debug( "foundPhoneUni=%s" , foundPhoneUni); # case 1: #<p class="phone"><strong>phone:</strong> 800.206.7886<br /> @@ -122,7 +122,7 @@ foundWeb = eachItemSoup. find (attrs={ "class" : "web" }); logging.debug( "foundWeb=%s" , foundWeb); if (foundWeb): - foundWebUni = unicode(foundWeb); + foundWebUni = str(foundWeb); logging.debug( "foundWebUni=%s" , foundWebUni); # <p class="web"><strong>e-mail:</strong> <a href="#">sales@cinesysinc.com</a><br /> @@ -151,7 +151,7 @@ foundAddr = eachItemSoup. find (attrs={ "class" : "addr" }); logging.debug( "foundAddr=%s" , foundAddr); if (foundAddr): - foundAddrUni = unicode(foundAddr); + foundAddrUni = str(foundAddr); # <p class="addr"> # <strong>address:</strong> 740 SW 21st Ave, Suite #310<br /> RefactoringTool: Files that were modified: RefactoringTool: 34563264_data_from_site.py |
此时,你可以看到原先的34563264_data_from_site.py,已经变成了Python 3.x的代码了。
对应的,也多出一个bak文件:34563264_data_from_site.py.bak,两者比较一下,即可看出区别:
当前,对于2to3.py本身,也可以通过help查看到更多的用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
D: mp mp_dev_rootpythonpython2_to_python3>D: mpWordPressDevRootPython27ToolsScripts2to3.py -h Usage: 2to3 [options] file | dir ... Options: -h, --help show this help message and exit -d, --doctests_only Fix up doctests only -f FIX, --fix=FIX Each FIX specifies a transformation; default: all -j PROCESSES, --processes=PROCESSES Run 2to3 concurrently -x NOFIX, --nofix=NOFIX Prevent a transformation from being run -l, --list-fixes List available transformations -p, --print- function Modify the grammar so that print() is a function - v , --verbose More verbose logging --no-diffs Don't show diffs of the refactoring -w, --write Write back modified files -n, --nobackups Don't write backups for modified files |
此处只多解释几句:
(1)如果上述不加-w参数,则默认只是把转换过程所对应的diff内容打印输出到当前窗口而已。
(2)加了-w,就是把改动内容,写回到原先的文件了。
(3)不想要生成bak文件,再加上-n即可。
(4)不想看到那一堆输出的内容,加上–no-diffs,即可。
其他的,就不多介绍了。感兴趣的可以自己去继续折腾。