2016-09-20 38 views
1

我以前能夠加載酸菜文件。我以不同的名字保存了一個新文件。我無法加載舊文件或新文件。這是一個令人失望,因爲它包含我努力擦洗的數據。無法加載酸菜文件

這裏是我用來保存代碼:

def pickleStore(): 
    pickle.dump(store, open("...shelf3.p", "wb")) 

這裏是我用它來重新加載代碼:

def pickleLoad(): 
    store = pickle.load(open(".../shelf3.p","rb")) 

創建的文件存在,而我跑pickleLoad( )沒有錯誤出現,面板變量瀏覽器中也沒有顯示任何變量。如果我嘗試加載不存在的文件,則會收到錯誤消息。

我正在運行spyder,python 3.5。

有什麼建議嗎?

+2

'store = ...'正在分配給一個局部變量,該函數在退出時不再存在。你的意思是在你的函數的前面有'global store',讓它分配給模塊級的變量? –

+0

是的,這是我的意圖。爲什麼我不希望他成爲這種情況會有一個原因嗎? – abc

+0

好吧,您實際上沒有*在您提供的功能中做其他任何*操作 - 它只是立即退出並丟棄檢索到的內容。你可能實際上證明你正試圖讀取那個局部變量並且發現它是空的,如果是這樣的話。 –

回答

2

如果你想從一個函數寫一個模塊級變量,你需要使用global關鍵字:

store = None 

def pickleLoad(): 
    global store 
    store = pickle.load(open(".../shelf3.p","rb")) 

...或返回值和執行從模塊級代碼分配:

store = None 

def pickleLoad(): 
    return pickle.load(open(".../shelf3.p","rb")) 

store = pickleLoad() 
1

作爲一般和更通用的做法,我建議是這樣的:

def load(file_name): 
    with open(simulation, 'rb') as pickle_file: 
     return pickle.load(pickle_file) 

def save(file_name, data): 
    with open(file_name, 'wb') as f: 
     pickle.dump(data, f) 

我已經爲了減少重寫相同的代碼幾次加入這個片段的若干項目。

+0

這個問題解決了什麼問題,除了確保文件描述符在塊退出後立即關閉(而不是推遲這種情況發生在垃圾回收時)? –