私は非常にPythonに慣れています。テキストファイルで定期的に繰り返されるヘッダー行をスキップして特定の行を抽出し、別のファイルに書き込むようにしています。私は次のコードでこれを行うことができましたが、これは非常に遅いです。ファイルをループして行を抽出します
import random
import sys
import os
with open('test.txt', encoding ='latin1') as rf:
with open('test1.txt', 'w') as wf:
for x, line in enumerate(rf): #reads the line number
#nskip = 3 #number of headers to skip
#nloop = 5 #number of loops in the file
ndata = 7 #number of lines in each loop
data = 4 #number of lines to be extracted
x+=1
#print(x,line)
for i in range(1,ndata+1):
for j in range((ndata*i - data)+1, ndata*i+1):
if x == j:
#print(line)
wf.write(line)
たとえば、このコードから、Line5、Line6、Line7、Line12、Line13、Line14、Line19、Line20、Line21(テストファイルにはLine1、Line2、Line3などの線があります) 。しかし、問題は私の実際のファイルが大きくて時間がかかり、メモリが大量にかかることです。これを行うためには、より高速でpythonicな方法が必要です。
また、私は各ループ内の行にループ番号を追加できるようにします。つまり、1番目のループはすべての行(1行、1行、6行、7行、1行、12行、13行2、Line14 2、Line19 3など)。私がやろうとしていることはこれよりやや複雑です。しかし、これは私の方法を舗装する必要があります。おかげさまで
はn_header_lines = 4とn_record_lines =各ループにおいて7本のラインと3とテストファイルにこの試み:置くうち、ライン5、7、9、15、17、19、25、27、29でした私は5,6,7,12,13,14,19,20,21などの行になると予想しています。だからコードはそれほど役に立ちません。これ以上の提案はありますか?投稿に感謝します。 – Luck4u
@ Luck4u:これを1行おきにスキップすると、 'next(rf)'の呼び出しの外側で 'rf'を繰り返していることがわかります。 'for line in rf:'のようなコードがないことを確認してください。 'next(rf) 'を呼び出すたびに1行が使われることにも注意してください。 forループの中でこれを2回実行すると、予想される速度の2倍で消費されます。私が言っていることは、コンセプトが健全で、あなたの実装が欠けているということです。あなたが私にそれを見てもらいたいのであれば、あなたの質問にそれを加えてください。 –
質問を編集しました。それが今より意味をなさないことを願っています。ありがとう! – Luck4u