python的pickle模塊實現了基本的數據序列和反序列化。經過pickle模塊的序列化操做咱們可以將程序中運行的對象信息保存到文件中去,永久存儲;經過pickle模塊的反序列化操做,咱們可以從文件中建立上一次程序保存的對象。python
python2使用的是cPickle模塊,而在python3中cPickle已經被取消,取而代之的是pickle模塊。google
開發過程當中,我曾經遇到一個奇怪的問題,在讀取一個文件時候,使用python2的以下方式:code
import cPickle train, test, dicts = cPickle.load(open("./dataset/atis.pkl"))
是能夠正常讀取文件的。 對象
但是當換作python3的方式讀取文件時候,以下:ci
import pickle train, test, dicts = pickle.load(open("./dataset/atis.pkl"))
卻得到了錯誤提示,提示信息以下:unicode
Traceback (most recent call last):
File 「Main.py」, line 4, in
train, test, dicts = pickle.load(open(「./dataset/atis.pkl」))
TypeError: ‘str’ does not support the buffer interface開發
查詢錯誤信息後得知解決辦法 連接,應該指明用二進制方式打開文件,因而代碼改成:get
import pickle train, test, dicts = pickle.load(open("./dataset/atis.pkl", "rb"))
但是這時候錯誤變成了:string
Traceback (most recent call last):
File 「Main.py」, line 4, in
train, test, dicts = pickle.load(open(「./dataset/atis.pkl」, 「rb」))
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe8 in position 0: ordinal not in range(128)it
因而再次求助萬能的google,終於找到了解決辦法 連接,咱們須要告訴pickle:how to convert Python bytestring data to Python 3 strings,The default is to try and decode all string data as ASCII,因此代碼改成:
import pickle train, test, dicts = pickle.load(open("./dataset/atis.pkl", "rb"), encoding='iso-8859-1')
問題終於的到了解決。