2016-11-16 106 views
2
filename = 'NTS.csv' 
mycsv = open(filename, 'r') 
mycsv.seek(0, os.SEEK_END) 

while 1: 
    time.sleep(1) 
    where = mycsv.tell() 
    line = mycsv.readline() 

if not line: 
    mycsv.seek(where) 
else: 
    arr_line = line.split(',') 
    var3 = arr_line[3] 

    print (var3) 

我有這個Paython代碼,它讀取csv文件中的值,每當從外部程序在csv中打印一行新行時。我的問題是,csv文件是定期完全重寫,然後python停止閱讀新行。我的猜測是,python卡在某些行號,新的更新可能會放50或更少的行。因此,例如,python現在在第70行等待新行,並且新行已經在第95行。我認爲解決方案是讓mycsv.seek(0,os.SEEK_END)得到更新,但不知道如何做到這一點。使用python讀取CSV文件

+0

這取決於文件如何被重寫。如果文件被有效地重寫*就地*,我無法重現...除了指針位於文件中的給定位置時,只有當文件至少具有該長度時纔會再次讀取。但要小心:文件中的指針沒有行計數的概念,只有字節計數... –

回答

0

你想要做什麼是很難完成的,而不每確保你是真正的最後一行倒放的文件。如果您知道每行大約有多少個字符,那麼您可以使用mycsv.seek(-end_buf,os.SEEK_END)執行一個快捷方式,如this answer中所述。所以,你的代碼可以在某種程度上像這樣工作:

avg_len = 50 # use an appropriate number here 
end_buf = 3 * avg_len/2 

filename = 'NTS.csv' 
mycsv = open(filename, 'r') 
mycsv.seek(-end_buf, os.SEEK_END) 
last = mycsv.readlines()[-1] 

while 1: 

    time.sleep(1) 
    mycsv.seek(-end_buf, os.SEEK_END) 
    line = mycsv.readlines()[-1] 

    if not line == last: 

     arr_line = line.split(',') 
     var3 = arr_line[3] 

     print (var3) 

這裏,在while循環的每次迭代,你試圖接近文件的結尾,只是遠不夠,你肯定知道的最後一個位置線將被包含在剩下的內容中。然後你閱讀所有剩餘的行(這可能包括第二行或第三行到最後一行的部分數量),並檢查這些行的最後一行是否與以前不同。

0

您可以通過簡單的方式讀取程序中的行。不要試圖使用seek以獲取所需內容,請嘗試在文件對象mycsv上使用readlines

你可以做到以下幾點:

mycsv = open('NTS.csv', 'r') 
csv_lines = mycsv.readlines() 

for line in csv_lines: 
    arr_line = line.split(',') 
    var3 = arr_line[3] 
    print(var3) 
+0

您的解決方案是可以的,但我有大約1000行,每次運行代碼時,python都會從第一行開始讀取數據。我需要python從最後開始。線 – manev