1. 程式人生 > >Pickle模塊數據對象持久化操作

Pickle模塊數據對象持久化操作

span 關閉 2.3 導入 prot 寫入文件 cnblogs 目錄下的文件 持久化

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

Pickle模塊數據對象持久化操作