2016-07-19 5 views
2

大きなテキストファイルを読んでいるので、特定の行から数値を読み込む必要があります。forループを2回繰り返すにはどうすればいいですか?

.... 
unknown number of lines 
.... 
ABCD 
some random stuff 
a number I want to read 
.... 
.... 

は私がユニークであるABCDだ「署名」行、後の2つのラインであるラインから番号を読みたい:ファイルには、次のようになります。

with open(filename,'r') as f: 
    for line in f: 
    if line.rstrip('\n') == 'ABCD': 
     continue 

しかしcontinueはわずか1回の反復でループのための前進:今、私がやっているものです。だから、実際に必要なラインを得るためにもう一度繰り返すにはどうすればいいですか?あなたはスキップされた行からのすべての情報を必要としない場合は

+0

明白なオプションは、正規表現のための 're'を使用しています。 're.match(r '\ d *'、your_text)'またはそれに類するものを使ってこの番号を抽出してください。 – PatNowak

答えて

5

明示的に(通常はあなたのためにするループのためのもの) * fnextを呼び出し、反復子を進め、その後continueを呼び出すことができます。

for line in f: 
    if line.rstrip('\n') == 'ABCD': 
     next(f) 
     continue 
    print(line) 

これます今印刷:

.... 

unknown number of lines 

.... 

a number I want to read 

.... 

.... 
これにより、 'ABCD'および 'some random stuff'をスキップする。

ABCDであり、最後の要素がである一般的なケースでは、これは問題を引き起こすものではありません。あなたが安全な側にいたいなら、try - exceptにそれを包んでStopIterationの例外をキャッチすることができます。この場合


*fが、それは自分のiteratorすなわちiter(f) is fだなので、これは動作します。一般的に、これは当てはまりません。リストの場合、反復子はそれ自身の別個のオブジェクトですlist_iteratorこのように進めると動作しません。

+0

これは、 'f'がイテレータである場合にのみ動作することに注意してください。これはファイルの場合に当てはまるかもしれませんが、 'f'が' list'だった場合、これを行う際にエラーが発生します。 (ループの前に変数を作成して反復子を変数に代入し、それをループされたオブジェクトとして使用することで、そのことを回避することができます)。 – jpmc26

+0

@ jpmc26実際はそうです。私は、これに当たる他の人が混乱するかもしれないので、それを追加します。 –

0

、あなたはcontinue INGの前にラインでファイルを手動で進めることができます。

with open(filename,'r') as f: 
    for line in f: 
     if line.rstrip('\n') == 'ABCD': 
      next(f)  # The next iteration of the for loop will skip a line 
      continue 

だけの事あなたはこのファイルから必要な場合それは1行で、continueの必要は全くありません。行をスキップし、次の行をつかんで、あなたが何をする必要があれば何でもして、forループのうちbreak、その中のすべてがifブロックからです。

+2

これは 'readline'の代わりに' next'を使う方が一般的に良いです。私はPython 3が何を約束しているのか分かりませんが、Python 2ではファイルの繰り返しと 'readline'を明示的に組み合わせても動作しません。 – user2357112

+0

@ user2357112良い点。更新しました。 – glibdud

1

あなたは、このアプローチに固執したい場合は、この操作を行います。

f = open(filename,'r'): 
while f.readline().rstrip('\n') != 'ABCD': # this will advanced the pointer to the ABCD line 
    continue 
f.next() # to skip over the unnecessary stuff 
desiredNumber = f.readline() # desired line 

を私は正規表現がかなり良く見えると思いますが、あなたは仕事を成し遂げるために何かをしたい場合は、ここにあります。

0

私はnext()のJimの使用@好むが、別のオプションは、単にフラグを使用することです:

with open(filename,'r') as f: 
    skip_line = False 
    for line in f: 
    if line.rstrip('\n') == 'ABCD': 
     skip_line = True 
     continue 
    if skip_line == True: 
    skip_line = False 
    else: 
    print(line) 
関連する問題