python3使用pickle讀取文件提示TypeError或者UnicodeDecodeError的解決辦法

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')

問題終於的到了解決。

相關文章
相關標籤/搜索