2012-07-05 54 views
15

我有大約50 GB的文本文件,我正在檢查每行的前幾個字符,並將這些字符寫入指定用於該起始文本的其他文件。Python文件每次打開/關閉與保持打開狀態直到完成過程

例如。 我輸入包含:

cow_ilovecow 
dog_whreismydog 
cat_thatcatshouldgotoreddit 
dog_gotitfromshelter 
............... 

所以,我要處理他們在牛,狗和貓(約200)類別 所以,

if writeflag==1: 
    writefile1=open(writefile,"a") #writefile is somedir/dog.txt.... 
    writefile1.write(remline+"\n") 
    #writefile1.close() 

那麼,什麼是最好的方式,我應該關?否則,如果我保持開放,是writefile1=open(writefile,"a")做正確的事情?

回答

28

你一定要嘗試打開/關閉文件儘可能少

因爲即使文件讀/寫的比較,文件打開/關閉是昂貴得多

考慮兩個代碼塊:

f=open('test1.txt', 'w') 
for i in range(1000): 
    f.write('\n') 
f.close() 

for i in range(1000): 
    f=open('test2.txt', 'a') 
    f.write('\n') 
    f.close() 

第一個就是0.025s而第二個需要0.309s

+0

太好了,應該已經測試過了,現在這樣可以使很少的開/關語句更有意義 – Ananta 2012-07-05 17:58:22

1

讓它一直開着!否則,你告訴系統你已經完成了寫操作,它可能決定將其刷新到磁盤上而不是緩衝它。並且由於顯而易見的原因n磁盤寫入比磁盤寫入貴得多。

如果你想附加到文件,而不覆蓋它然後是的,a是正確的模式。

+0

謝謝,我總是打開但文件加載到內存中的整個文件。 – Ananta 2012-07-05 18:06:00

4

使用with語句時,它會自動關閉該文件爲你做的所有操作with塊內,所以它會繼續爲你打開文件,一旦你走出with塊將關閉文件。

with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3: 
    #do something here 

編輯: 如果你知道要使用所有可能的文件名代碼的編譯,然後使用with之前是一個更好的選擇,如果你不這樣做,那麼你應該用你的方法,但不是關閉文件即可flush將數據寫入文件使用writefile1.flush()

+0

如果他爲輸入中的每個前綴打開一個新文件,'with'語句可能會有點笨拙,並且在編譯時是否知道所有可能的前綴都不清楚。 – geoffspear 2012-07-05 17:07:31

+0

@Wooble好點!使用'with'意味着他需要在運行前知道所有的文件名,但是如果他知道所有的文件名,那麼在這種情況下'with'是更好的選擇。 – 2012-07-05 17:13:45

+1

另外,對於200個類別,文件的字典而不是200個變量可能是最好的解決方案。 – geoffspear 2012-07-05 17:15:11

-1

IO操作消耗的時間太多。也打開並關閉文件。

如果您打開兩個文件(輸入和輸出),使用內存緩衝區(例如10MB大小)進行文本處理,然後將其寫入輸出文件,速度會更快。例如:

file = {} # just initializing dicts 
filename = {} 
with open(file) as f: 
    file['dog'] = None 
    buffer = '' 
    ... 
    #maybe there is a loop here 
    if writeflag: 
     if file['dog'] == None: 
      file['dog'] = open(filename['dog'], 'a') 
     buffer += remline + '\n' 
    if len(buffer) > 1024*1000*10: # 10MB of text 
     files['dog'].write(buffer) 
     buffer = '' 

for v in files.values(): 
    v.close() 
+0

我可能會這樣做,但我想它應該是不同的緩衝區爲每個前綴,所以,在處理原始文件中的某些行後寫入所有文件可能會更好的選項權利? – Ananta 2012-07-05 18:04:36

+0

-1,這是你應該在你的應用程序代碼中做的事。操作系統足夠聰明,如果你允許它們自己緩衝讀/寫操作(即在每次操作後不要關閉/重新打開文件)。更不用說爲緩衝區使用字符串與列表相比相當昂貴。 – ThiefMaster 2012-07-05 18:26:55

+0

@ThiefMaster我剛做了一個簡單的基準測試,結果發現使用字符串緩衝區的速度比直接使用io的速度快13%,比使用列表緩衝區的速度快5%。實際上,Python中的字符串操作是真正優化的。你可以在這裏查看代碼:http://paste.kde.org/513206/ – 2012-07-05 20:56:09

相關問題