python中pickle模块_Python pickle模块的用法
串行化主要用于網絡傳輸或者持久化。我們知道,網絡上的數據都是字節流,如果希望將某個對象傳送給遠端的機器,首先就必須將其轉換成字節流,然后才可以在網絡上傳輸。文件也是字節流,如果希望將某個對象保存到文件中,首先也是需要將其轉換成字節流,然后才可以保存。
與串行化對應的是反串行化,即從字節流中恢復出原來的對象。這樣傳輸才有意義。
基本流程
將串行化和反串行化與網絡傳輸合并起來,便可以得到如圖 1 所示的描述過程。
圖 1 串行化和反串行化
如果是通過文件永久保存或備份數據,則可以使用圖6-2來表示該過程。
圖 2 對象保存的過程
可以看出,串行化在這兩個領域是非常有用的。串行化的基本要求即是恢復的對象要等價于原來的對象,不能有信息丟失現象。
pickle用法
串行化相關的模塊很多,如 pickle、cpickle、json 和 marshal 等,它們都在轉換效率和壓縮效率上下了不少功夫,但其基本功能大同小異。所以本教程并不會將這些模塊都進行詳細介紹,主要介紹 pickle 庫的用法。
pickle 不用安裝,其是 Python 自帶的包,使用時僅需要引入該包即可。方法如下:
import pickle
pickle 包主要提供了兩個功能,一個是將對象轉換成字節流,即串行化;另一個是將字節流轉換成對象,即反串行化。每個功能又分出了兩個分支,一個是僅轉換成字節流,另一個是轉換成字節流并保存到文件中去。所以 pickle 包主要有 4 個接口,如表 3 所示。
表 3 pickle包的主要接口串行化
操 作串行化反串行化
轉換+文件操作
dump()
load()
轉換
dumps()
loads()
1) dump(對象,文件對象):串行化并保存到文件
dump 的文件對象要求是可寫的。
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> fd = open("tmp,bin", "wb")
>>> fd
>>> pickle.dump(a, fd)
>>> fd.close()
>>> fd2 = open("tmp,bin", "rb")
>>> a2 = pickle.load(fd2)
>>> a2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2) load(文件對象):從文件讀數據并恢復出對象
load 函數從文件對象中讀出一個對象,返回值就是該對象。上面的例子中演示了如何使用該接口函數。
3) dumps(對象):僅串行化
dumps 函數返回一個字節流。
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s = pickle.dumps(a)
>>> s
'(lp0\nI0\naI1\naI2\naI3\naI4\naI5\naI6\naI7\naI8\naI9\na.'
>>> type(s)
>>> b = pickle.loads(s)
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4) loads(字節流):從字節流中恢復出對象
輸入應該是 dumps() 的返回值。注意,不要隨意構造字節流,因為并不是所有的字節流都能被解析出來。該接口函數的用法在上面的例子中已經演示過了。
另外,可不可以將多個對象保存到一個文件中呢?答案是可以。如果需要寫入多個對象,則可以多次調用 dump() 函數。同樣,在恢復時也要多次調用 load() 函數。它們之間的對應關系是,第一次 load() 得到的對象是第一次 dump() 對應的對象,第二次 load() 得到的對象是第二次 dump() 對應的對象,簡單來說就是先進先出。
下面的代碼演示了這個用法。
>>> a1 = range(3)
>>> a1
[0, 1, 2]
>>> a2 = range(5)
>>> a2
[0, 1, 2, 3, 4]
>>> fd = open("tmp,bin", "wb")
>>> pickle.dump(a1, fd) # 先寫入短的列表
>>> pickle.dump(a2, fd) # 再寫入長的列表
>>> fd.close()
>>> fd2 = open("tmp,bin", "rb")
>>> b1 = pickle.load(fd2)
>>> b1 # 先讀出來的是短的列表
[0, 1, 2]
>>> b2 = pickle.load(fd2)
>>> b2 # 再讀出來的是長的列表
[0, 1, 2, 3, 4]
>>> fd2.close()
總結
以上是生活随笔為你收集整理的python中pickle模块_Python pickle模块的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux命令英文全称解释【转载】
- 下一篇: python中递归函数基例_智慧树pyt