2013-04-16 64 views
1

我有一個鹹菜轉儲這是我從一個朋友了,他問我讀它喜歡:Python:如何閱讀pickle dump?

f = open('file.pickle') 
import pickle 
l = pickle.loads(f.read()) 

但我得到一個ImportErrorno module named sql.models

有人可以幫助我明白髮生了什麼?

回答

5

您缺少重建醃製對象所需的代碼。

Pickles存儲可以從中導入類的位置,以及實例屬性。原始模塊仍然需要重新創建模塊。從documentation

請注意,函數(內置的和用戶定義的)由「完全限定」的名稱引用而不是按值賦值。這意味着只有函數名稱被醃漬,以及定義該函數的模塊的名稱。該函數的代碼及其任何函數屬性都不會被醃製。因此,定義模塊必須可以在取消環境中導入,並且模塊必須包含指定的對象,否則將引發異常。 [4]

類似地,類按名稱引用進行醃製,因此在取消環境中應用相同的限制。需要注意的是無類的代碼或數據的酸洗,所以在下面的例子中,class屬性attr在在unpickle環境沒有恢復:

class Foo: 
    attr = 'a class attr' 

picklestring = pickle.dumps(Foo) 

這些限制是爲什麼picklable函數和類必須在頂部定義級別的模塊。

換句話說,用於原始數據創建鹹菜包括一個名爲sql.models模塊中始發一個自定義類中的至少一個實例。

請仔細閱讀任意泡菜,即使是朋友。 pickle只是一種重新生成任意Python結構的堆棧語言。你可以構建一個泡菜,在你的計算機上產生一個祕密的後門服務器,並有足夠的決心和技巧。該pickle機制的文檔警告你明確:

警告:該pickle模塊並非意在對抗錯誤或惡意構造的數據安全。切勿取消從不可信或未經認證的來源收到的數據。

這有been a problem in the past,即使是經驗豐富的開發人員。

+0

我是否需要編寫這些類? –

+0

@DeankankarBajpeyi:我會問你的朋友的代碼;你將無法單獨從鹹菜中重建原來的課程。 –

+0

謝謝。我懷疑他是否想爲我的系統設置一個後門:P但我會小心:D –