2016-08-10 11 views
0

が、私はのように見えるテキストファイル持っているとしましょう:「ファイル内の行のための」:中readine()を使用Pythonの:ループ

a 
b 
start_flag 
c 
d 
e 
end_flag 
f 
g 

私はラインで、このデータ・ラインを反復したいのが、私「start_flag」を遭遇し、私は「end_flag」に到達するまで反復との間で行数をカウントする:

newline = '' 
for line in f: 
    count = 0 
    if 'start_flag' in line: 
     while 'end_flag' not in newline: 
      count += 1 
      newline = f.readline() 
     print(str(count)) 

このコードの予想される動作は何ですか?

a 
b 
start_flag 
    c 
    d 
    e 
    end_flag 
f 
g 

または::

a 
b 
start_flag 
    c 
    d 
    e 
    end_flag 
c 
d 
e 
end_flag 
f 
g 
+6

なぜあなたはそれを試して自分自身を見つけ出すのではなく、どのように働くのでしょうか? 'readline'とファイルの反復を混在させることは十分にサポートされていませんが、' next(f) '(または別の' for'ループ)を使うと、ファイルは独自のイテレータなので、最初の例のように動作します。 – Blckknght

+0

私はそれをテストし、他に誰も望んでいなければ回答を投稿します。提案にも感謝します。 – Umibozu

+0

私の結果は次のように示しています:a、b、flag、fag、c、d、e、f、g ....だから私はあなたの選択肢を得ていません.... – D3181

答えて

0

readline()を使用する必要があるべきではありません、それは次のように繰り返されます。このようにそれを試してみてください。

with open(path, 'r') as f: 
    count = 0 
    counting = False 
    for line in f: 
     if 'start_flag' in line: 
      counting = True 
     elif 'end_flag' in line: 
      counting = False 
      #do something with your count result 
      count = 0 #reset it for the next start_flag 
     if counting is True: 
      count += 1 

これはあなただけで一度にファイルを順番に実行できるように、正しい順序でif文でそれをすべて処理します。明らかにこれに多くの操作を追加することができ、複数の開始フラグと終了フラグを実行することを期待する場合は、結果を使用して操作を行うことができます。

+0

一般的なコンセンサスは、 forループイテレータとreadline関数はBlinknghtが言った。みんなからのご意見ありがとうございます。 – Umibozu

+1

一般に、ファイルを読み込む順序を混乱させるのは非常に難しいです。シンプルでシンプルな方法で簡単に作業できるようになったら、おそらくそれは正しいことです。 – Jeff

0

使用この:

enter = False 
count = 0 
for line in f: 
    if 'start_flag' in line: 
    enter = True 
    if 'end_flag' in line: 
    print count 
    count = 0 
    enter = False 
    if enter is True: 
    count+=1