摘要:使用來創建一個表示該對象值的字符串。數據被序列化以后,你可以將它們寫入文件套接字管道等等中。如果你使用管道或者套接字,在通過連至另一端的連接傾倒所有對象推送數據之后,別忘了沖洗。
目的:Python對象序列化
可用性:pickle至少1.4版本,cPickle 1.5版本以上
pickle模塊實現了一種算法,將任意一個Python對象轉化成一系列字節(byets)。此過程也調用了serializing對象。代表對象的字節流之后可以被傳輸或存儲,再重構后創建一個擁有相同特征(the same characteristics)的新的對象。
cPickle使用C而不是Python,實現了相同的算法。這比Python實現要快好幾倍,但是它不允許用戶從Pickle派生子類。如果子類對你的使用來說無關緊要,那么cPickle是個更好的選擇。
警告:本文檔直接說明,pickle不提供安全保證。如果你在多線程通信(inter-process communication)或者數據存儲或存儲數據中使用pickle,一定要小心。請勿信任你不能確定為安全的數據。
導入如平常一樣,嘗試導入cPickle,給它賦予一個別名“pickle”。如果因為某些原因導入失敗,退而求其次到Python的原生(native)實現pickle模塊。如果cPickle可用,能給你提供一個更快速的執行,否則只能是輕便的執行(the portable implementation)。
pythontry: import cPickle as pickle except: import pickle編碼和解碼
第一個例子將一種數據結構編碼成一個字符串,然后把該字符串打印至控制臺。使用一種包含所有原生類型(native types)的數據結構。任何類型的實例都可被腌漬(pickled,譯者注:模塊名稱pickle的中文含義為腌菜),在稍后的例子中會演示。使用pickle.dumps()來創建一個表示該對象值的字符串。
pythontry: import cPickle as pickle except: import pickle import pprint data = [ { "a":"A", "b":2, "c":3.0 } ] print "DATA:", pprint.pprint(data) data_string = pickle.dumps(data) print "PICKLE:", data_string
pickle默認僅由ASCII字符組成。也可以使用更高效的二進制格式(binary format),只是因為在打印的時候更易于理解,本頁的所有例子都使用ASCII輸出。
python$ python pickle_string.py DATA:[{"a": "A", "b": 2, "c": 3.0}] PICKLE: (lp1 (dp2 S"a" S"A" sS"c" F3 sS"b" I2 sa.
數據被序列化以后,你可以將它們寫入文件、套接字、管道等等中。之后你也可以從文件中讀取出來、將它反腌漬(unpickled)而構造一個具有相同值得新對象。
pythontry: import cPickle as pickle except: import pickle import pprint data1 = [ { "a":"A", "b":2, "c":3.0 } ] print "BEFORE:", pprint.pprint(data1) data1_string = pickle.dumps(data1) data2 = pickle.loads(data1_string) print "AFTER:", pprint.pprint(data2) print "SAME?:", (data1 is data2) print "EQUAL?:", (data1 == data2)
如你所見,這個新構造的對象與原對象相同,但并非同一對象。這不足為奇。
python$ python pickle_unpickle.py BEFORE:[{"a": "A", "b": 2, "c": 3.0}] AFTER:[{"a": "A", "b": 2, "c": 3.0}] SAME?: False EQUAL?: True與流一起工作
除dumps()和loads()外,pickle還提供一對用在類文件流(file-like streams)的轉化函數。可以往一個流中寫對個對象,然后從流中把它們讀取出來,此過程不需要預先寫入的對象有幾個、它們多大。
pythontry: import cPickle as pickle except: import pickle import pprint from StringIO import StringIO class SimpleObject(object): def __init__(self, name): self.name = name l = list(name) l.reverse() self.name_backwards = "".join(l) return data = [] data.append(SimpleObject("pickle")) data.append(SimpleObject("cPickle")) data.append(SimpleObject("last")) # 使用StringIO模擬一個文件 out_s = StringIO() # 寫入該流 for o in data: print "WRITING: %s (%s)" % (o.name, o.name_backwards) pickle.dump(o, out_s) out_s.flush() # 建立一個可讀流 in_s = StringIO(out_s.getvalue()) # 讀數據 while True: try: o = pickle.load(in_s) except EOFError: break else: print "READ: %s (%s)" % (o.name, o.name_backwards)
這個例子使用SringIO緩存器(buffer)模擬流,所以在建立可讀流的時候我們玩了一把。一個簡單數據庫的格式化也可以使用pickles來存儲對象,只是shelve與之工作更加簡便。
python$ python pickle_stream.py WRITING: pickle (elkcip) WRITING: cPickle (elkciPc) WRITING: last (tsal) READ: pickle (elkcip) READ: cPickle (elkciPc) READ: last (tsal)
除了存儲數據,pickles在進程間通信(inter-process communication)中也非常稱手。例如,使用os.fork()和os.pipe()可以創立工作者進程(worker processes),從一個管道(pipe)讀取作業指令(job instruction)然后將結果寫入另一個管道。管理工作者池(worker pool)和將作業送入、接受響應(response)的核心代碼可被重用,因為作業和響應并不屬于某個特定類中。如果你使用管道或者套接字(sockets),在通過連至另一端(end)的連接傾倒(dumps)所有對象、推送數據之后,別忘了沖洗(flush)。如果你想寫自己的工作者池管理器,請看multiprocessing。
原文:pickle and cPickle – Python object serialization - Python Module of the Week 的前半部分
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45327.html
摘要:對象序列化從這篇文章粗略翻譯的模塊可以實現任意的對象轉換為一系列字節即序列化對象的算法。的文檔明確的表明它不提供安全保證。而利用則可以控制序列化的細節。 Python 對象序列化——pickle and cPickle 從這篇文章粗略翻譯的pickle and cPickle pickle模塊可以實現任意的Python對象轉換為一系列字節(即序列化對象)的算法。這些字節流可以 被...
摘要:重構對象的問題當與你自己的類一起工作時,你必須保證類被腌漬出現在讀取的進程的命名空間中。因為使用值而不能被腌漬的類,可以定義和來返回狀態的一個子集,才能被腌漬。腌漬和反腌漬該圖來創建一個結點集合。 承接上文 pickle和cPickle:Python對象的序列化(上) 。 重構對象的問題 當與你自己的類一起工作時,你必須保證類被腌漬出現在讀取pickle的進程的命名空間中。...
摘要:利用標準庫中的的模塊可以將對象轉換為一種可以傳輸或存儲的格式。主要方法模塊中有兩個主要函數,它們是和。具體語法為返回一個字符串,而不是存入文件中。該方法用于反序列化,即將序列化的對象重新恢復成對象。除此之外,這兩個模塊的接口是幾乎完全相同。 對象存在于程序運行時的內存中,當程序不再運行時或斷電關機時,這些對象便不再存在。我現在想把對象保存下來,方便以后使用,這就是持久化技術。利用 py...
摘要:反序列化安全問題一這一段時間使用做開發,使用了存儲,閱讀了源碼,發現在存儲到過程中,利用了模塊進行序列化以及反序列化正好根據該樣例學習一波反序列化相關的安全問題,不足之處請各位表哥指出。 Python 反序列化安全問題(一) 這一段時間使用flask做web開發,使用了redis存儲session,閱讀了flask_session源碼,發現在存儲session到redis過程中,利用了...
摘要:默認為或者說,是以格式保存對象如果設置為或者,則以壓縮的二進制格式保存對象。但是,要小心坑試圖增加一個坑就在這里當試圖修改一個已有鍵的值時沒有報錯,但是并沒有修改成功。要填平這個坑,需要這樣做多一個參數沒有坑了還用循環一下 pickle pickle是標準庫中的一個模塊,在Python 2中還有一個cpickle,兩者的區別就是后者更快。所以,下面操作中,不管是用import pick...
閱讀 2158·2023-04-25 20:45
閱讀 1068·2021-09-22 15:13
閱讀 3642·2021-09-04 16:48
閱讀 2580·2019-08-30 15:53
閱讀 928·2019-08-30 15:44
閱讀 936·2019-08-30 15:43
閱讀 1002·2019-08-29 16:33
閱讀 3432·2019-08-29 13:08