2016-09-08 10 views
0

私は、非常に大きなデータの入力データのTSの下の各行の最大値を見つけるつもりです。これは、入力データである:各タイムステップのテキストと数字の間の最大値を見つける

SCALAR 
ND 3 
ST 0 
TS  10.00 
0.0000 
0.0000 
0.0000 
SCALAR 
ND 3 
ST 0 
TS  3600.47 
255.1744 
255.0201 
257.0000 
SCALAR 
ND 3 
ST 0 
TS  7200.42 
255.5984 
255.4946 
255.7014 
SCALAR 
ND 3 
ST 0 
TS  10000.0 
256.5984 
255.1946 
255.7014 

私は次のように同じフォーマット形式の異なるタイムステップでの最大値を保存したい終わり:

SCALAR 
ND 3 
ST 0 
TS  0.00 
**256.60** 
**255.49** 
**257.00** 

私はこのようなコードを書かれています

from __future__ import print_function 

lines = [] 
Newlist = [] 
with open('data.txt') as f, open('output.txt', 'w') as outfile: 
    for line in f: 
     lines.append(line.rstrip('\n')) 
     lines1=list(enumerate(lines)) 
     list_n=list(zip(*(iter(lines),)*7)) 
     max_value = max(float(n) for n in list_n) 
print(max_value, file=outfile) 

プログラムは最後の行まで動作しますが、最後の行を実行すると、次のエラーが表示されます。ValueError:max()argは空のシーケンスです。どうしてか分かりません。

この例を小さくするために、TSの後に多数の数字を削除したことに言及しておきます。チェックする必要がある値はたくさんあります。各タイムステップ(TS)の同じ行をチェックする必要があります。

答えて

2

あなたの試行はいくつかの場所で失敗します。あなたはlines1に割り当てられましたが、それを無視して、linesリストを使用して、それぞれの繰り返しでmax()値を生成しようとすると、数字以外の行は除外されず、float()を呼び出そうと失敗し、線が正しく表示されます。

入力ファイルが非常に大きい場合は、max()関数を使用せず、ファイルを解析する際に3つの最大値をトラッキングして、これまでの最大値に対して各行をテストします。

TS行になるまでファイルを読み取ってから、SCALAR行またはファイルの最後まで行を消費してください。それらはあなたが出力ファイルに書き出す最大値を得たい数値です。

私は、そうでない場合は、できるだけ多くのフォーマットを維持したい:

zip()はできるだけ早く入力の一つが排出されるよう反復を停止する。なお
maxima = [[float('-inf'), ''] for _ in range(3)] 

with open('data.txt') as f: 
    for line in f: 
     if line.startswith('TS'): 
      # timestamp group, find maximum for the next 3 lines 
      for maximum, line in zip(maxima, f): 
       value = float(line) 
       if value > maximum[0]: 
        maximum[:] = value, line 

with open('output.txt', 'w') as outfile: 
    # write header to output file 
    outfile.write('SCALAR\nND 3\nST 0\nTS  0.00\n') 
    # write the 3 maximum lines: 
    for value, line in maxima: 
     outfile.write(line) 

maximaを最初に置くことによって、たびに3行しか読み込まれないことを意味します。私はのリストをfloat('-inf')で始めました。なぜなら、定義上、他の浮動小数点値はそれより大きいと考えられるからです。また、改行を取り除く必要はないことに注意してください。 float()は先頭または末尾の空白を気にしないので、行末の改行はその関数によって無視されます。

上記は最大値を浮動小数点値として追跡しますが、元の行はそのまま残ります。出力ファイルには、丸め値ではなく256.5984,255.4946および257.0000が含まれています。

これはあなたの元に出力近いを与える:

>>> from io import StringIO 
>>> sample = StringIO('''\ 
... SCALAR 
... ND 3 
... ST 0 
... TS  10.00 
... 0.0000 
... 0.0000 
... 0.0000 
... SCALAR 
... ND 3 
... ST 0 
... TS  3600.47 
... 255.1744 
... 255.0201 
... 257.0000 
... SCALAR 
... ND 3 
... ST 0 
... TS  7200.42 
... 255.5984 
... 255.4946 
... 255.7014 
... SCALAR 
... ND 3 
... ST 0 
... TS  10000.0 
... 256.5984 
... 255.1946 
... 255.7014 
... ''') 
>>> maxima = [[float('-inf'), ''] for _ in range(3)] 
>>> with sample as f: 
...  for line in f: 
...   if line.startswith('TS'): 
...    # timestamp group, find maximum for the next 3 lines 
...    for maximum, line in zip(maxima, f): 
...     value = float(line) 
...     if value > maximum[0]: 
...      maximum[:] = value, line 
... 
>>> outfile = StringIO() 
>>> outfile.write('SCALAR\nND 3\nST 0\nTS  0.00\n') 
34 
>>> for value, line in maxima: 
...  outfile.write(line) 
... 
9 
9 
9 
>>> print(outfile.getvalue()) 
SCALAR 
ND 3 
ST 0 
TS  0.00 
256.5984 
255.4946 
257.0000 

あなたは2つの小数に丸められた出力を持つようにしたいなかった場合は、いつでも、代わりにoutfile.write('{:.2f}\n'.format(value))を使用することができます。

+0

@MohamadRezaSalehiSadaghiani:行数が異なる可能性がありますか?ファイルを開いたときにいくつの行が先頭にあるのか知っていますか?そうでない場合は、行全体の数は常に同じになりますか? –

+0

はい。しかし、私は別のループとカウント+関数でそれを解決しました。 –

+0

最大値で行数を取得するにはどうすればいいですか?私はこの行を見つけて別のファイルを開き、2番目のファイルの2つのvaluseを読み込み、新しいデータを書きたいと思います! –

関連する問題