1. 程式人生 > >python pickle模組學習理解(一)

python pickle模組學習理解(一)

pickle提供了一個簡單的持久化功能。可以將物件以檔案的形式存放在磁碟上。pickle模組只能在python中使用,python中幾乎所有的資料型別(列表,字典,集合,類等)都可以用pickle來序列化,在學習過程中參考很多前輩的程式碼,在此總結一下,並提供可用的函式供大家參考。環境:win7 32 位,python3.6
一. 基本使用方法
pickle.dump(obj, file, [,protocol])  註解:將物件obj儲存到檔案file中去。protocol為序列化使用的協議版本,0:ASCII協議,所序列化的物件使用可列印的ASCII碼錶示;1:老式的二進位制協議;2:2.3版本引入的新二進位制協議,較以前的更高效。其中協議0和1相容老版本的python。protocol預設值為0。file:物件儲存到的類檔案物件。file必須有write()介面, file可以是一個以’w’方式開啟的檔案或者一個StringIO物件或者其他任何實現write()介面的物件。如果protocol>=1,檔案物件需要是二進位制模式開啟的。
先測試一下,當前路徑建立檔案 pickT.txt pickt.ini pickT.bin應該夠了,這裡引用程式碼參考http://www.cnblogs.com/pzxbc/archive/2012/03/18/2404715.html表示感謝

# coding: utf8
import  pickle
if __name__ == "__main__":
    data1 = {'a': [1, 2.0, 3, 4 + 6j],
             'b': ('string', u'Unicode string'),
             'c': None}
    filename="pickT.txt" #pickT.txt pickt.ini pickT.bin  測試都可以以
    with open(filename,'wb') as fw:
        pickle.dump(data1, fw,-1) 
    with open(filename, 'rb') as fw:
        s=pickle.load(fw)
    print("s的型別",type(s))
    print("s的值",s)

執行結果如下:
s的型別 <class ‘dict’> 這裡發現序列化的最大優勢,取到的資料不需要做資料轉換了(如果用TXT檔案直接讀取)
s的值 {‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}
pickle.dump(data1, fw,-1)
如前文protocol為序列化使用的協議版本
pickT.txt格式如下(-1二進位制格式,亂碼)這樣保護了你的資料:
�昹 }�(�a擼�(K[email protected] K�builtins攲complex敁擥@

[email protected] 啍R攅�b攲string攲Unicode string攩攲c擭u.
如果需要觀察這些變數 修改為pickle.dump(data1, fw,0)
執行後pickT.txt格式如下
(dp0
Va
p1
(lp2
L1L
aF2.0
aL3L
ac__builtin__
complex
p3
(F4.0
F6.0
tp4
Rp5
asVb
p6
(Vstring
p7
VUnicode string
p8
tp9
sVc
p10
Ns.
二 儲存多個值測試
我有10個變數儲存到十個檔案是很蠢的事情,這麼做還不如直接讀取檔案。直接看程式碼

# coding: utf8
import  pickle
if __name__ == "__main__":
    data1 = {'a': [1, 2.0, 3, 4 + 6j],
             'b': ('string', u'Unicode string'),
             'c': None}
    filename="pickT.txt" #pickT.txt pickt.ini pickT.bin  測試都可以以
    selfref_list = [1, 2, 3]
    with open(filename,'wb') as fw:
        pickle.dump(data1, fw,-1)
        pickle.dump(selfref_list, fw, -1)
    with open(filename, 'rb') as fw:
        s=pickle.load(fw)  #取第一個變數
        print("s的型別",type(s))
        print("s的值",s)
        s1=pickle.load(fw)   #取第二個變數
        print("s1的型別", type(s1))
        print("s2的值", s1)  

輸出:
s的型別 <class ‘dict’>
s的值 {‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}
s1的型別 <class ‘list’>
s2的值 [1, 2, 3]
這裡添加了兩個變數data1(dict),selfref_list(list)
pickle.dump(data1, fw,-1)
pickle.dump(selfref_list, fw, -1)
s=pickle.load(fw) #取第一個變數 ,s1=pickle.load(fw) #取第二個變數呼叫一側pickle.load獲得一個變數
這樣基本清楚了,下面給出一個可以使用的函式,自己寫的,請大家指正。

# coding: utf8
import  pickle
def storeTree(filename,*args):
    with open(filename,'wb') as fw:  #開啟需要用'wb'
        for i in args:
            pickle.dump(i, fw,-1) #為了保護資料protocol=-1,設為0可以看到資料

def grabTree(filename):
    Mylist=[]   #返回變數的列表
    with open(filename,'rb') as fr:
        while True:        #這裡用try最簡單,不用定義迴圈次數
            try:
                Mylist.append(pickle.load(fr))
            except:
                break
    return Mylist

if __name__ == "__main__":
    data1 = {'a': [1, 2.0, 3, 4 + 6j],
             'b': ('string', u'Unicode string'),
             'c': None}
    selfref_list = [1, 2, 3]
    filename="pickT.bin"
    storeTree(filename,data1,selfref_list)
    s=grabTree(filename)
    print("返回資料型別",type(s))
    print("返回資料內容",s)
    for Num ,i in enumerate(s):
        print("{}{}{}{}".format("第",Num+1,"個變數型別=",type(i)))
        print("{}{}{}{}".format("第",Num+1,"個變數值=",i))

輸出:
返回資料型別 <class ‘list’>
返回資料內容 [{‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}, [1, 2, 3]]
第1個變數型別=<class ‘dict’>
第1個變數值={‘a’: [1, 2.0, 3, (4+6j)], ‘b’: (‘string’, ‘Unicode string’), ‘c’: None}
第2個變數型別=<class ‘list’>
第2個變數值=[1, 2, 3]
下一篇 python pickle模組學習理解(二)