Python2迁移到Python3

最近看到Github上一个Python的repo有点意思,欲clone下来试一试,然而却发现是Python3.X版本,于是打算将其修改为Python2.7版本。
于是,新的轮子又产生了。
下面记录在网上查找到的python2与python3的区别:

1
2
#coding=utf-8
from __future__ import print_function
  • 最核心的变化, 对 bytes 和 原生 UNICODE 字符串的支持, 删除了 unicode 对象, str 为原生 unicode 字符串, bytes 替代了之前的 str
  • 类库的变化, 组织结构变了些. 但功能没变. urlparse - > urllib.parse
  • 去除``,全部改用repr()
  • 关键词加入as 和with,还有True,False,None
  • 捕获异常必须使用except…as…的格式
  • 加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量
  • “import thread”问题,2.x中的模块thread在3.x中变成”_thread”(需要在前面加一个下划线).否则会出现”ImportError: No module named thread”
  • input() 函数解析用户的输入
    Python3中input得到的为str;Python2的input的到的为int型,Python2的raw_input得到的为str类型)统一一下:Python3中用input,Python2中用row_input,都输入为str
  • 除法
    Python3中/表示真除,Python2中/取决于除数被除数是否为整型
    此外,两个版本中,%表示取余,//表示地板除(结果取整)

  • 去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数
    print() 函数
    Python3中print为一个函数,必须用括号括起来;Python2中print为class

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Python2:

    print "Hello world!"
    print "Hello %s"%("jim")

    Python3:

    print ("Hello world!")
    print ("Hello %s"%("jim"))


    2.X: print "The answer is", 2*2
    3.X: print("The answer is", 2*2)
    2.X: print x, # 使用逗号结尾禁止换行
    3.X: print(x, end=" ") # 使用空格代替换行
    2.X: print # 输出新行
    3.X: print() # 输出新行
    2.X: print >>sys.stderr, "fatal error"
    3.X: print("fatal error", file=sys.stderr)
    2.X: print (x, y) # 输出repr((x, y))
    3.X: print((x, y)) # 不同于print(x, y)!
  • xrange模块:
    Python2中range()和xrange()是两种不同的实现,在Python3中,range()被移除了,保留了xrange()的实现,但将xrange()重新命名成range()
    Python2中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    1. range()返回整个list
    2. xrange()返回的是一个 xrange object
    3. 二者都适用于 for 循环
    4. xrange()占用更少的内存

    >>> range(5)
    [0, 1, 2, 3, 4]
    >>> range(1,5)
    [1, 2, 3, 4]

    >>> xrange(5)
    xrange(5)
    >>> list(xrange(5))
    [0, 1, 2, 3, 4]
    >>> xrange(1,5)
    xrange(1, 5)


    for i in range(0, 100):
    print i

    for i in xrange(0, 100):
    print i
  • urllib
    2.X中的 urllib 和 urllib2 在3.X中整合为 urllib,其对应关系如下

Python 2 name Python 3 name
urllib.urlopen() Deprecated
urllib.urlretrieve() urllib.request.urlretrieve()
urllib.urlcleanup() urllib.request.urlcleanup()
urllib.quote() urllib.parse.quote()
urllib.quote_plus() urllib.parse.quote_plus()
urllib.unquote() urllib.parse.unquote()
urllib.unquote_plus() urllib.parse.unquote_plus()
urllib.urlencode() urllib.parse.urlencode()
urllib.pathname2url() urllib.request.pathname2url()
urllib.url2pathname() urllib.request.url2pathname()
urllib.getproxies() urllib.request.getproxies()
urllib.URLopener urllib.request.URLopener
urllib.FancyURLopener urllib.request.FancyURLopener
urllib.ContentTooShortError urllib.error.ContentTooShortError
—- —-
urllib2.urlopen() urllib.request.urlopen()
urllib2.install_opener() urllib.request.install_opener()
urllib2.build_opener() urllib.request.build_opener()
urllib2.URLError urllib.error.URLError
urllib2.Request urllib.request.Request
urllib2.OpenerDirector urllib.request.OpenerDirector
urllib2.BaseHandler urllib.request.BaseHandler
urllib2.HTTPDefaultErrorHandler urllib.request.HTTPDefaultErrorHandler
urllib2.HTTPRedirectHandler urllib.request.HTTPRedirectHandler
urllib2.HTTPCookieProcessor urllib.request.HTTPCookieProcessor
urllib2.ProxyHandler urllib.request.ProxyHandler
urllib2.HTTPPasswordMgr urllib.request.HTTPPasswordMgr
urllib2.HTTPPasswordMgrWithDefaultRealm urllib.request.HTTPPasswordMgrWithDefaultRealm
urllib2.AbstractBasicAuthHandler urllib.request.AbstractBasicAuthHandler
urllib2.HTTPBasicAuthHandler urllib.request.HTTPBasicAuthHandler
urllib2.ProxyBasicAuthHandler urllib.request.ProxyBasicAuthHandler
urllib2.AbstractDigestAuthHandler urllib.request.AbstractDigestAuthHandler
urllib2.HTTPDigestAuthHandler urllib.request.HTTPDigestAuthHandler
urllib2.ProxyDigestAuthHandler urllib.request.ProxyDigestAuthHandler
urllib2.HTTPHandler urllib.request.HTTPHandler
urllib2.HTTPSHandler urllib.request.HTTPSHandler
urllib2.FileHandler urllib.request.FileHandler
urllib2.FTPHandler urllib.request.FTPHandler
urllib2.CacheFTPHandler urllib.request.CacheFTPHandler
urllib2.UnknownHandler urllib.request.UnknownHandler