ファイルからデータを取り出すために次の関数を作成しました。それは正常に動作しますが、大きなファイルでは非常に遅くなります。ファイルを複数回反復せずにデータを取り出す
def get_data(file, indexes, data_start, sieve_first = is_float):
file_list = list(file)
for i in indexes:
d_line = i+data_start
for line in file_list[d_line:]:
if sieve_first(line.strip().split(',')[0]):
yield file_list[d_line].strip()
d_line += 1
else:
break
def is_float(f):
try:
float(str(f))
except:
return False
else:
return True
with open('my_data') as f:
data = get_data(f, index_list, 3)
ファイルは(行番号が、明確にするために追加された)のようになります。上記の例を
line 1234567: # <-- INDEX
line 1234568: # +1
line 1234569: # +2
line 1234570: 8, 17.0, 23, 6487.6
line 1234571: 8, 17.0, 23, 6487.6
line 1234572: 8, 17.0, 23, 6487.6
line 1234572:
line 1234572:
line 1234572:
、1234572スルーライン1234570が得られます。
私のファイルが大きいので、自分の機能について嫌いなことがいくつかあります。
- まず、ファイル全体をメモリに読み込みます。私はこれを行うので、データを解析するために行の索引付けを使用できます。
- 第2に、ファイル内の同じ行が何度も繰り返し処理されるということです。これは、大きなファイルでは非常に高価になります。
私はイテレータを使用してファイルを一度に抜け出そうとしていましたが、それを解読することはできませんでした。助言がありますか?
'list(file) 'の代わりに' for line in file'を実行してください。 –
@ cricket_007ありがとうございます。ただし、 'file'がインデックス作成をサポートしていない場合、残りの関数は動作しません。 –
ファイルが索引付けをサポートしていなかった場合、どのように 'file [d_line:]'をやっていますか? –