2016-11-16 16 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

何がやりたいことは、ファイルを巻き戻すことなく、あなたが最後の行に本当にされていることを確認するたびに達成することは困難です。各行に約文字数があることが分かっている場合は、this answerで概説したように、mycsv.seek(-end_buf、os.SEEK_END)を使用して取得できるショートカットがあります。だから、あなたのコードは次のように何らかの形で仕事ができる:

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ループの各反復では、あなたが最後の確認のためにあなたが知っているだけにまでさかのぼる十分に、ファイルの末尾に近い位置へのシークラインは残っているものに含まれます。次に、残りの行をすべて読み込みます(これはおそらく、2行目または3行目から最後の行の部分量を含んでいます)。そして、これらの行の最後の行が前の行と異なるかどうかを確認します。

0

プログラム内の行をより簡単に読み取ることができます。必要なものを得るためにseekを使用する代わりに、ファイルオブジェクトmycsvreadlinesを使用してみてください。

次の操作を行うことができます

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

関連する問題