python中pickle模块_Python pickle模块的用法
串行化主要用于網(wǎng)絡(luò)傳輸或者持久化。我們知道,網(wǎng)絡(luò)上的數(shù)據(jù)都是字節(jié)流,如果希望將某個(gè)對(duì)象傳送給遠(yuǎn)端的機(jī)器,首先就必須將其轉(zhuǎn)換成字節(jié)流,然后才可以在網(wǎng)絡(luò)上傳輸。文件也是字節(jié)流,如果希望將某個(gè)對(duì)象保存到文件中,首先也是需要將其轉(zhuǎn)換成字節(jié)流,然后才可以保存。
與串行化對(duì)應(yīng)的是反串行化,即從字節(jié)流中恢復(fù)出原來(lái)的對(duì)象。這樣傳輸才有意義。
基本流程
將串行化和反串行化與網(wǎng)絡(luò)傳輸合并起來(lái),便可以得到如圖 1 所示的描述過程。
圖 1 串行化和反串行化
如果是通過文件永久保存或備份數(shù)據(jù),則可以使用圖6-2來(lái)表示該過程。
圖 2 對(duì)象保存的過程
可以看出,串行化在這兩個(gè)領(lǐng)域是非常有用的。串行化的基本要求即是恢復(fù)的對(duì)象要等價(jià)于原來(lái)的對(duì)象,不能有信息丟失現(xiàn)象。
pickle用法
串行化相關(guān)的模塊很多,如 pickle、cpickle、json 和 marshal 等,它們都在轉(zhuǎn)換效率和壓縮效率上下了不少功夫,但其基本功能大同小異。所以本教程并不會(huì)將這些模塊都進(jìn)行詳細(xì)介紹,主要介紹 pickle 庫(kù)的用法。
pickle 不用安裝,其是 Python 自帶的包,使用時(shí)僅需要引入該包即可。方法如下:
import pickle
pickle 包主要提供了兩個(gè)功能,一個(gè)是將對(duì)象轉(zhuǎn)換成字節(jié)流,即串行化;另一個(gè)是將字節(jié)流轉(zhuǎn)換成對(duì)象,即反串行化。每個(gè)功能又分出了兩個(gè)分支,一個(gè)是僅轉(zhuǎn)換成字節(jié)流,另一個(gè)是轉(zhuǎn)換成字節(jié)流并保存到文件中去。所以 pickle 包主要有 4 個(gè)接口,如表 3 所示。
表 3 pickle包的主要接口串行化
操 作串行化反串行化
轉(zhuǎn)換+文件操作
dump()
load()
轉(zhuǎn)換
dumps()
loads()
1) dump(對(duì)象,文件對(duì)象):串行化并保存到文件
dump 的文件對(duì)象要求是可寫的。
>>> 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(文件對(duì)象):從文件讀數(shù)據(jù)并恢復(fù)出對(duì)象
load 函數(shù)從文件對(duì)象中讀出一個(gè)對(duì)象,返回值就是該對(duì)象。上面的例子中演示了如何使用該接口函數(shù)。
3) dumps(對(duì)象):僅串行化
dumps 函數(shù)返回一個(gè)字節(jié)流。
>>> 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(字節(jié)流):從字節(jié)流中恢復(fù)出對(duì)象
輸入應(yīng)該是 dumps() 的返回值。注意,不要隨意構(gòu)造字節(jié)流,因?yàn)椴⒉皇撬械淖止?jié)流都能被解析出來(lái)。該接口函數(shù)的用法在上面的例子中已經(jīng)演示過了。
另外,可不可以將多個(gè)對(duì)象保存到一個(gè)文件中呢?答案是可以。如果需要寫入多個(gè)對(duì)象,則可以多次調(diào)用 dump() 函數(shù)。同樣,在恢復(fù)時(shí)也要多次調(diào)用 load() 函數(shù)。它們之間的對(duì)應(yīng)關(guān)系是,第一次 load() 得到的對(duì)象是第一次 dump() 對(duì)應(yīng)的對(duì)象,第二次 load() 得到的對(duì)象是第二次 dump() 對(duì)應(yīng)的對(duì)象,簡(jiǎn)單來(lái)說(shuō)就是先進(jìn)先出。
下面的代碼演示了這個(gè)用法。
>>> 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) # 再寫入長(zhǎng)的列表
>>> fd.close()
>>> fd2 = open("tmp,bin", "rb")
>>> b1 = pickle.load(fd2)
>>> b1 # 先讀出來(lái)的是短的列表
[0, 1, 2]
>>> b2 = pickle.load(fd2)
>>> b2 # 再讀出來(lái)的是長(zhǎng)的列表
[0, 1, 2, 3, 4]
>>> fd2.close()
總結(jié)
以上是生活随笔為你收集整理的python中pickle模块_Python pickle模块的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Linux命令英文全称解释【转载】
 - 下一篇: IOC操作Bean管理注解方式(创建对象