日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python2.7与3.7脚本转换_python 2.7 - python 3.7 升级记录

發(fā)布時間:2025/3/8 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python2.7与3.7脚本转换_python 2.7 - python 3.7 升级记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

更換的模塊

python 3.7 模塊名

python 2.7 模塊名

python 3.7 包

python 2.7包

pymysql

MySQLdb

PyMySQL

MySQL-python

pdfminer

pdfminer

pdfminer.six

pdfminer

urllib.parse

urlparse

自帶

自帶

html

HTMLParser

自帶

HTMLparser

語法變化

1. print 修改為 print()

2. except Exception, e 修改為 except Exception as e

3. import 相對路徑導(dǎo)入

python3.7 模塊A import 同一目錄下的模塊B時,需要顯式使用from . import

場景實驗:

絕對路徑~/test/有python文件main.py和文件夾work,work里有兩個文件a.py, b.py,如下所示:

|-main.py

|-work

----|-a.py

----|-b.py

其中a.py 的內(nèi)容:

import b

print ("import a")

b.py的內(nèi)容

print ("import b")

main.py的內(nèi)容

from work import a

print "main"

執(zhí)行 python main.py 后報錯:

traceback (most recent call last):

File "main.py", line 1, in

from work import a

File "/home/wangding/test/work/a.py", line 2, in

import b

ModuleNotFoundError: No module named 'b'

將a.py 的import語句修改為

from . import b

執(zhí)行Python main.py后成功輸出

import b

import a

main

4. 字典dict 取消了has_key()方法,使用 ”key in dict“語法代替

meta = {"a": 123}

if "a" in meta: # python 2.7 語法if meta.has_key("a"):

print True

5. 字符編碼問題

1)redis

以默認參數(shù)創(chuàng)建StrictRedis實例,

Python2: 寫入unicode/str,讀回均為str

Python3:寫入str/bytes,讀回均為bytes

建議StrictRedis初始化時設(shè)置參數(shù)decode_responses=True,讀回的結(jié)果在python2下均為unicode,在python3下均為str,返回的結(jié)果均按照字符串來進行后續(xù)操作

python2的 str和unicode類型均可以按照字符串操作,很多場景下會混淆使用。python3的str和bytes類型區(qū)分更加嚴格,避免了之前的歧義。

2)json,base64

python2 json序列化支持unicode和str類型; python3 json序列化只支持str類型,不支持bytes類型。

python2 base64編碼默認生成str類型;python3 base64編碼默認生成bytes類型。

因此,python2版本下語句

import base64, json

img = open(img_file, "rb").read() # 讀取一副圖片

meta = {"data": base64.b64encode(img)} # 生成字典

json.dumps(meta) #將字典序列化(常用于POST遠程服務(wù))

在python3 版本中會出錯,原因是meta['data']是bytes類型,不能被json序列化。python3 需要將b64encode輸出再次轉(zhuǎn)碼為str

import base64, json

img = open(img_file, "rb").read()

meta = {"data": base64.b64encode(img).decode()} # 調(diào)用decode()轉(zhuǎn)為str類型的base64碼

json.dumps(meta)

3) hashlib計算md5

python2 支持對unicode和str類型計算md5;

python3 只支持對bytes類型計算md5

6. 內(nèi)置map(),filter()函數(shù)

python2 返回列表

python3 返回迭代器

在python2中經(jīng)常使用map()和lambda函數(shù)來代替for循環(huán)操作,比如

map(lambda x: x.start(), processes) # 將processes中的所有進程對象啟動

在python3中由于迭代器具有惰性計算的性質(zhì),上述語句在python3中不會啟動進程,直到有訪問迭代器對象的操作出現(xiàn)。如:

list(map(lambda x: x.start(), processes)) # 將map()轉(zhuǎn)換為list,觸發(fā)lambda函數(shù)執(zhí)行,進程啟動

7. dict.keys()

python2 返回列表

python3 返回迭代器

8. dict 迭代過程中禁止增減成員

如下代碼,在字典迭代過程中試圖刪除某成員

a= dict(zip(range(10),range(10)))

for k in a.keys():

if k == 5:

a.pop(k)

在python2中可以執(zhí)行,結(jié)果為

>>>print a

Out[5]: {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 6: 6, 7: 7, 8: 8, 9: 9}

在python3中運行報錯:

RuntimeError Traceback (most recent call last)

in ()

----> 1 for k in a.keys():

2 if k == 5:

3 a.pop(k)

4

RuntimeError: dictionary changed size during iteration

總結(jié)

以上是生活随笔為你收集整理的python2.7与3.7脚本转换_python 2.7 - python 3.7 升级记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。