2016-11-16 2 views
1

私は非常に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など)。私がやろうとしていることはこれよりやや複雑です。しかし、これは私の方法を舗装する必要があります。おかげさまで

答えて

2

ヘッダーとレコードは固定サイズになっているので、ヘッダー行の数をスキップして、ファイルの末尾に達するまでレコード行数を繰り返し書きます。

n_header_lines = 25 
n_record_lines = 100 
page_num = 0 

with open('test.txt', encoding ='latin1') as rf, with open('test1.txt', 'w') as wf: 
    try: 
     while True: 
      page_num += 1 
      for _ in range(n_header_lines): 
       next(rf) 
      for line_num in range(1, n_record_lines + 1): 
       prefix = 'Line {:3d} {:3d} '.format(line_num, page_num) 
       wf.write(prefix + next(rf))) 
    except StopIteration: 
     pass 
+0

は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

+0

@ Luck4u:これを1行おきにスキップすると、 'next(rf)'の呼び出しの外側で 'rf'を繰り返していることがわかります。 'for line in rf:'のようなコードがないことを確認してください。 'next(rf) 'を呼び出すたびに1行が使われることにも注意してください。 forループの中でこれを2回実行すると、予想される速度の2倍で消費されます。私が言っていることは、コンセプトが健全で、あなたの実装が欠けているということです。あなたが私にそれを見てもらいたいのであれば、あなたの質問にそれを加えてください。 –

+0

質問を編集しました。それが今より意味をなさないことを願っています。ありがとう! – Luck4u

関連する問題