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方法,將以二進位制格式儲存的物件還原回來
(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)
(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) #
從位元組物件中讀取被封裝的物件
(str2) ('
a', 1, '小泉'
)>>>type(str2)
'tuple
'>
#測試字串
>>> str = '
hello world!
'>>> import
pickle
>>> str1 =pickle.dumps(str)
>>> str2 =pickle.loads(str1)
(str2)
hello world!
>>>type(str)
'str
'>
>>>type(str2)
'str
'>
pickle與cpickle對比
前者是完全用python來實現的模組,這個cpickle是用c來實現的,它的速度要比pickle快好多倍。
一般建議如果電腦中只要有cpickle的話都應該使用它。
參考資料:
pickle模組的使用講解:
資料持久化 pickle 物件封存
模組pickle實現了對乙個 python 物件結構的二進位制序列化和反序列化。pickling 是將 python 物件及其所擁有的層次結構轉化為乙個位元組流的過程,而 unpickling 是相反的操作,會將 來自乙個 binary file 或者 bytes like object 的 位元組...
python資料持久儲存 pickle模組
pickle模組實現了基本的資料序列和反序列化。pickle模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,通過pickle模組的反序列化操作,能夠從檔案中建立上一次程式儲存的物件。介面 pickle.dump obj,file,protocol 將物件obj儲存到檔案file中 pi...
Python中使用pickle持久化物件
python中可以使用 pickle 模組將物件轉化為檔案儲存在磁碟上,在需要的時候再讀取並還原。pickle.dump obj,file protocol 這是將物件持久化的方法,引數的含義分別為 obj 要持久化儲存的物件 file 乙個擁有 write 方法的物件,並且這個 write 方法能...