2016-04-07 11 views
1

私がログインしていた.csvファイルの最後の行の値を取得します。<code>DataLogging.csv</code>温度と湿度に

2016-04-07 09:36 16.0 48.7 
2016-04-07 09:37 16.0 48.7 
2016-04-07 09:38 16.0 48.7 
2016-04-07 09:39 16.1 48.8 
2016-04-07 09:40 16.1 48.7 

row[0]は私に

最速の方法にはどのようなものです湿度

日、 row[1]温度と row[2]を取得ファイルの最後の行から温度と湿度の値を取得します(最後に記録された値)。この場合、 09:40

@Edit:Loggerはラズベリーパイ2上で実行されます

私はこの方法を見つけました:(Stackoverflow Link

from collections import deque 
import csv 

def get_last_row(csv_filename): 
    with open(csv_filename, 'rb') as f: 
     return deque(csv.reader(f), 1)[0] 

lastline = ', '.join(get_last_row('DataLogger.csv')) 
values = lastline.split("\t") 
print ((values[1])) 

今私が最終ラインからの温度値を取得します....

+0

この問題は、基本的に['ファイルの最終行にアクセスする方法]です。(http://stackoverflow.com/questions/136168/get-last-n-lines-of-a-file-with -python-similar-to-tail)、さらにこの最後の行を[特定の列にアクセスする]の解析(http://stackoverflow.com/questions/17186893/accessing-column-data-from-a-csv-file -in-python)を実行します。 – aluriak

答えて

2

あなたはUnix-yシステムを利用していると思うので、このような単純なものはうまくいくはずです+それはファイル全体を読み取らないため高速です。

import subprocess 
last_line = subprocess.check_output(["tail", "-1", "DataLogging.csv"]) 
# to get the values (parsing via the csv module seems excessive for one line) 
temp_hum = [float(x) for x in last_line.split()[2:]] 

seek()を使用するクロスプラットフォームソリューションは、アプローチを実装することによって作成できます。 tail's source codeのコメントは、それがどのように動作するかを説明しています。

最後のN_LINES行をファイルFDの最後から印刷します。ファイルの先頭にヒットするまで、または の改行を読み取るまで、一度に(おそらく を除いて) 'BUFSIZ'バイトを読み取って、ファイルを通して後方に移動します( )。 START_POSは、FDに関連付けられたファイルの読み出しポインタ の開始位置です(非ゼロかもしれません)。 END_POSは、 のEOFのファイルオフセット(最後のバイトのオフセットより1つ大きい)です。成功した場合は、 を返します。

+0

kewlありがとう、私はまた 'deque'を使って方法を見つけました。 –

+1

@PeterS Cool cool。私は、 'deque'ソリューションが最初から最後までファイル全体を読み込むのだろうかと思います。今は問題にはならないかもしれませんが、ファイルが大幅に増加した場合、 'tail'は後方を読むという利点があります。 ['tail'のソースコード](http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c#n464)から:*"ファイルを逆戻りして、 BUFSIZバイトを一度に(おそらく最初のファイルを除いて)、ファイルの先頭に移動するかNUMBER個の改行を読み込まなければなりません。 "* – jDo

+1

ええ、全ファイルを読み込むかどうかはわかりません。今のところ、かなり速く動作します(ファイル内の20,000行、約2週間の測定値)私はおそらくあなたのバージョンに切り替える必要があります。私のpiはこれ以上処理できません:-)ありがとう –

関連する問題