2017-06-08 58 views
0

如何打開文件,讀取文件,然後寫入文件來替換整個內容,然後關閉它?Ruby - 讀取文件,替換內容,然後關閉

我可以這樣做:

File.open('foo.bin', 'r') do |f| 
    contents = f.read 
end 
# do something with the contents 
File.open('foo.bin', 'w') do |f| 
    f.print contents 
end 

但也有2個IO開放的步驟和2個IO在接近步驟,並加倍IO步驟似乎是一個完全是浪費,不要更難提與磁盤上儘可能多地發生在我的腳本中。

有沒有辦法打開,閱讀,覆蓋,然後關閉?

+0

考慮使用不要求你閱讀每一個數據塊的更好的數據格式,只是對其進行處理。 SQLite總是一個好的開始。另外,在決定這是什麼讓它變慢之前,你是否對代碼進行了剖析? – Schwern

+0

由於商業決策的方式高於我的頭,我必須保持它完全本地和便攜到任何沒有外部依賴的機器。這幾乎消除了任何數據庫的可能性。而且尺寸太大而無法存儲在內存中。它把IO作爲我唯一的選擇,我的問題依然存在。 – yenadar

+0

是的,這是幾個減速之一。我正在處理每個問題,包括這一個。 – yenadar

回答

3

首先,如果你沒有分析你的代碼,現在就做。一個額外的文件打開/關閉不太可能是你減速的原因。分析將顯示真正的問題在哪裏。

我不相信這會更快,但這裏有一個通用的步驟來做到這一點,打開和關閉。

  1. 打開閱讀&寫。
  2. 閱讀整個文件(不是逐行)。
  3. 截斷文件。
  4. 回到最初。
  5. 寫。
  6. 關閉。

在Ruby中,你這樣做,就像這樣:

# Open the file for read/write. 
File.open("test.data", "r+") { |f| 
    # Read the whole file 
    contents = f.read 

    # Truncate the file 
    f.truncate(0) 

    # Jump back to the beginning 
    f.rewind 

    # Write the new content 
    f.write("new stuff\n") 
} 
+0

謝謝,很高興能學到一些東西。 – yenadar

+0

至少在我的系統(Ruby 2.4,OS X)中,'truncate'似乎沒有調整位置,所以你也可能不得不「倒帶」它。 – Stefan

+0

@Stefan是的,我覺得它有點可疑。我會添加倒帶,謝謝。沒有倒帶會發生什麼? – Schwern