Pickle模塊的作用是持久化(序列化)的儲存數據。因此我先解釋下:什麼是序列化與反序列化、什麼是對象序列化和對象反序列化。通俗地講,它們的定義如下:序列化: 把一個對象保存到一個文件或資料庫欄位中去;反序列化: 在適當的時候把這個文件再轉化成原來的對象使用;對象的序列化: 把對象轉換為位元組序列的過 ...
Pickle模塊的作用是持久化(序列化)的儲存數據。
因此我先解釋下:什麼是序列化與反序列化、什麼是對象序列化和對象反序列化。
通俗地講,它們的定義如下:
序列化: 把一個對象保存到一個文件或資料庫欄位中去;
反序列化: 在適當的時候把這個文件再轉化成原來的對象使用;
對象的序列化: 把對象轉換為位元組序列的過程;
對象的反序列化: 把位元組序列恢復為對象的過程;
使用場合:
使用序列化主要是因為跨平臺和對象存儲的需求,因為網路上只允許字元串或者二進位格式,而文件需要使用二進位流格式。
如果想把一個記憶體中的對象存儲下來就必須使用序列化轉換為xml(字元串)、json(字元串)或二進位(流)等
註意: file.write/read操作的字元串對象,而pickle.dump/load操作的是結構化數據對象(如:列表、字典)。
常用介面:
(1) pickle.dump(obj, file, [,protocol]) #將obj對象序列化存入已經打開的file中。
obj: 結構化對象
file: 類文件對象(對象保存)
protocol: 序列化使用的協議版本。protocol預設值為0。
0:ASCII協議,所序列化的對象使用可列印的ASCII碼表示;
1:老式的二進位協議;
2:2.3版本引入的新二進位協議,較以前的更高效
(2) pickle.load(file) # 將file中的對象序列化讀出。
(3) pickle.dumps(obj[, protocol]) #以位元組對象形式返回封裝的對象,不需要寫入文件中。
(4) pickle.loads(file) #從位元組對象中讀取被封裝的對象,並返回。
dump能將多個對象序列化存儲到同一個文件中,隨後調用load()來以同樣的順序反序列化讀出這些對象。
#pickle用法舉例: version: python 3.3.4 1.dump和load >>> import pickle #導入pickle >>> my_list = ['ABC','123','中文',['123']] #添加一個測試列表 >>> pickle_file = open('my_list.pkl','wb') #文件(my_list.pkl)必須以二進位可寫模式打開,即"wb" >>> pickle.dump(my_list,pickle_file) #調用pickle.dump方法,將my_list以二進位的方式寫入pickle_file對象 >>> pickle_file.close() #關閉文件對象 >>> import os; os.getcwd() #引入os包,查看當前python目錄 'D:\\Python33' >>> os.listdir('D:\\Python33') #查看指定目錄下的文件,可以看到已經生成一個名為my_list.pkl的二進位文件 [... 'my_list.pkl', .....] >>> pickle_file2 = open('my_list.pkl','rb') #文件(my_list.pkl)必須以二進位可讀模式打開,即"rb" >>> my_list2 = pickle.load(pickle_file2) #調用ickle.load方法,將以二進位格式保存的對象還原回來 >>> print (my_list2) ['ABC', '123', '中文', ['123']] #可以看出對象已經還原 #改進寫法: >>> import pickle >>> my_list = ['ABC','123','中文',['123']] >>> with open('my_list.pkl','wb') as file1: #採用with open as方式,不需要再調用close() pickle.dump(my_list,file1) >>> import os >>> os.listdir(os.getcwd()) [... 'my_list.pkl', .....] >>> with open('my_list.pkl','rb') as file2: new_list = pickle.load(file2) >>> print (new_list) ['ABC', '123', '中文', ['123']] 2.dumps和loads #測試元組 >>> import pickle #導入pickle >>> tuple1 = ('A',1,'小泉') #添加一個元祖 >>> tuple1 ('A', 1, '小泉') >>> str1 = pickle.dumps(tuple1) #以位元組對象形式返回封裝的對象,不需要寫入文件中 >>> str2 = pickle.loads(str1) #從位元組對象中讀取被封裝的對象 >>> print (str2) ('A', 1, '小泉') >>> type(str2) <class 'tuple'> #測試字元串 >>> str = 'Hello World!' >>> import pickle >>> str1 = pickle.dumps(str) >>> str2 = pickle.loads(str1) >>> print (str2) Hello World! >>> type(str) <class 'str'> >>> type(str2) <class 'str'>
Pickle與CPickle對比
前者是完全用Python來實現的模塊,這個CPickle是用C來實現的,它的速度要比pickle快好多倍。
一般建議如果電腦中只要有CPickle的話都應該使用它。
參考資料:
pickle模塊的使用講解: http://blog.csdn.net/coffee_cream/article/details/51754484