2016-09-12 48 views
0

我正在編寫一個程序來組織我的學校標記,併爲每個主題創建了一個file.pck,其中保存了該主題的所有標記。既然我都開和和pickle.load 10+的文件,我決定把兩個功能,files_open():在Python上打開和關閉大量文件

subj1 = open(subj1_file) 
subj1_marks = pickle.load(subj1) 
subj2 = open(subj2_file) 
subj2marks = pickle.load(subj2) 

和file_close():

subj1.close() 
subj2.close() 

的問題是,我不得不做出file_open()全局變量中的每個變量現在的功能都太長了。我試圖通過調用像這樣的變量來避免這個問題:

file_open.subj1 

但它確實工作,我不明白爲什麼。

+0

你可以發佈你的函數和你的代碼?當我們不知道你在做什麼時,很難幫助你。 – MooingRawr

+0

你爲什麼要把文件打開?你不能一次性打開'''pickle.load'和'close'嗎? –

+0

一般來說,如果你有一堆類似的值將被執行相同的操作,它們應該全部在一個單獨的容器中(可能是列表或字典),而不是單個變量。對一個容器的內容進行迭代很容易,除了通過重複代碼之外,對一堆變量做些事情是無法完成的。 – jasonharper

回答

1

,因爲你只是想打開,裝載和關閉文件之後,我會建議一個簡單的輔助功能:

def load_marks(filename): 
    with open(filename,"rb") as f: # don't forget to open as binary 
     marks = pickle.load(f) 
    return marks 

使用這樣的:

外出時
subj1_marks = load_marks(subj1_file) 

該文件被關閉with區塊的範圍,即使文件已關閉,您的數據仍然可以訪問,這可能是您的問題(無理)。

注意:有人建議你真正想要的(可能)是將所有數據保存在一個大的pickle文件中。 在這種情況下,你可以創建一個包含數據字典:

d = dict() 
d["mark1"] = subj1_marks 
d["mark2"] = subj2_marks 
... 

,並執行一個唯一pickle.dump()pickle.load()詞典中(如果數據picklable那麼這個數據的詞典也picklable):這將是更容易處理1個大文件而不是其中的大部分文件,因爲無論如何你都需要所有這些文件。

+0

難道你不想使用'pickle.load(f)'? –

+0

抓到沒有測試我的代碼:)謝謝。古典錯誤。 –

+0

我認爲這裏的OP需要一些指針來學習Python字典。你能幫助他嗎? – jsbueno