あなたの試行はいくつかの場所で失敗します。あなたは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))
を使用することができます。
@MohamadRezaSalehiSadaghiani:行数が異なる可能性がありますか?ファイルを開いたときにいくつの行が先頭にあるのか知っていますか?そうでない場合は、行全体の数は常に同じになりますか? –
はい。しかし、私は別のループとカウント+関数でそれを解決しました。 –
最大値で行数を取得するにはどうすればいいですか?私はこの行を見つけて別のファイルを開き、2番目のファイルの2つのvaluseを読み込み、新しいデータを書きたいと思います! –