更換的模塊
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 相對路徑導入
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 的內容:
import b
print ("import a")
b.py的內容
print ("import b")
main.py的內容
from work import a
print "main"
執行 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
執行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
以默認參數創建StrictRedis實例,
Python2: 寫入unicode/str,讀回均為str
Python3:寫入str/bytes,讀回均為bytes
建議StrictRedis初始化時設置參數decode_responses=True,讀回的結果在python2下均為unicode,在python3下均為str,返回的結果均按照字符串來進行后續操作
python2的 str和unicode類型均可以按照字符串操作,很多場景下會混淆使用。python3的str和bytes類型區分更加嚴格,避免了之前的歧義。
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遠程服務)
在python3 版本中會出錯,原因是meta['data']是bytes類型,不能被json序列化。python3 需要將b64encode輸出再次轉碼為str
import base64, json
img = open(img_file, "rb").read()
meta = {"data": base64.b64encode(img).decode()} # 調用decode()轉為str類型的base64碼
json.dumps(meta)
3) hashlib計算md5
python2 支持對unicode和str類型計算md5;
python3 只支持對bytes類型計算md5
6. 內置map(),filter()函數
python2 返回列表
python3 返回迭代器
在python2中經常使用map()和lambda函數來代替for循環操作,比如
map(lambda x: x.start(), processes) # 將processes中的所有進程對象啟動
在python3中由于迭代器具有惰性計算的性質,上述語句在python3中不會啟動進程,直到有訪問迭代器對象的操作出現。如:
list(map(lambda x: x.start(), processes)) # 將map()轉換為list,觸發lambda函數執行,進程啟動
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中可以執行,結果為
>>>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