2009-06-22 51 views
2

我正在分階段將文件寫入磁盤。當我寫它時,我需要知道我寫的用於構建索引的行號。該文件現在有1200萬行,因此我需要即時構建索引。我通過四個步驟來完成這項工作,其中包含四個我正在索引的值。基於我在其他地方發現的一些例子,我決定保持我的函數儘可能乾淨,我會在開始寫入之前得到文件的行大小,以便我可以使用該數繼續構建我的索引。如果我需要行數並且需要附加到文件,我可以避免處理文件兩次嗎?

所以我過這個問題跑,理論上所以我想獲取當前的大小我想

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a') 
try: 
    num_lines=sum(1 for line in myFile) 
except IOError: 
    num_lines=0 

當我不知道,如果我加入了第一塊或最後塊到我的文件我這樣做的結果是始終爲0,即使MYFILE存在,並且有一個NUM_LINES> 0

如果我這樣做,而不是:

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt') 
try: 
    num_lines=sum(1 for line in myFile) 
except IOError: 
    num_lines=0 

我得到正確的值當且僅當MYFILE存在。 byt如果myFile不存在,如果我在第一個週期,我收到一條錯誤消息。

當我寫出這個問題時,我發現在每個文件存在的情況下,值num_lines = 0的原因是因爲文件正在被打開用於追加以便文件在最後一行打開並且現在正在等待線路交付。所以這解決了這個問題

try: 
    myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt') 
    num_lines=sum(1 for line in myFile) 

except IOError: 
    num_lines=0 

我的問題是這是否可以做另一種方式。我問的原因是因爲我現在必須關閉myFile並重新打開它以便追加:

這就是我現在需要做的工作,我已經在文件中的數據的結束索引號有

myFile.close() 
myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a') 

現在,這裏是也許我學習something-因爲我不得不打開該文件,然後也許兩次獲得起始索引(NUM_LINES)應該被移動到一個功能

def getNumbLines(myFileRef): 
    try: 
     myFile=open(myFileRef) 
     num_lines=sum(1 for line in myFile) 
     myFile.close() 
    except IOError: 
     num_lines=0 
    return num_lines 

如果我不必打開/處理文件兩次,它會更乾淨。

基於埃裏克溫德林的答案,我可以這樣做:

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','a+') 
num_lines=sum(1 for line in myFile) 

感謝

+3

谷歌搜索一個更好的方法來計算在python線我達到了這個http://stackoverflow.com /問題/ 845058 /如何到獲得-線計數便宜功能於蟒蛇。 – Macarse 2009-06-22 16:28:32

+0

我想知道這是否是計算行數的最佳方法,但是我認爲我會與原始問題一起去避免將問題與另一個計數混淆。 – Erik 2009-06-22 16:31:16

+0

我的行計數解決方案是基於這個問題 – PyNEwbie 2009-06-22 16:45:08

回答

4

您可以打開一個文件進行讀取和寫入:

myFile=open(r'C:\NEWMASTERLIST\FULLLIST.txt','r+') 

嘗試。

更新:啊,我的錯誤,因爲該文件可能不存在。使用'a +'而不是'r +'。

0

打開更新的文件( 'U' 或 'RW',我忘了)。現在你可以讀取它直到EOF,然後開始寫入追加。

0

我假設你正在寫這個文件,那麼你爲什麼不保持你已經寫了多少行的單獨軌道? 對我來說,看起來很浪費,你必須逐行閱讀整個文件才能得到行號。

0

有點遲到了,但該文件存在的問題,爲什麼不使用(僞代碼):

If FileExists(C:\NEWMASTERLIST\FULLLIST.txt') then 
begin 
    Open file etc 
    Calc numlines etc 
end 
else 
    Create new file etc 
    NumLines := 0; 
end;