2016-08-10 1 views
0

Lets sagen, dass ich eine Textdatei, die wie folgt aussieht:Python: Mit readine() in „für Zeile in der Datei:“ Loop

a 
b 
start_flag 
c 
d 
e 
end_flag 
f 
g 

ich für Zeile über diese Datenleitung möchte laufen, aber wenn ich begegnen einem ‚start_flag‘, möchte ich wiederholen, bis ich eine ‚end_flag‘ erreichen und zählen die Anzahl der Linien dazwischen:

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)) 

Was das erwartete Verhalten dieses Codes ist? Wird es iterieren wie:

a 
b 
start_flag 
    c 
    d 
    e 
    end_flag 
f 
g 

Oder:

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

Warum fragen Sie uns, wie es funktioniert, anstatt es nur zu versuchen und herauszufinden? Soweit ich mich erinnere, wird das Mischen von "readline" mit Iteration in einer Datei nicht gut unterstützt, aber die Verwendung von "next (f)" (oder eine andere for-Schleife) würde wahrscheinlich wie Ihr erstes Beispiel funktionieren, da Dateien ihre eigenen Iteratoren sind. – Blckknght

+0

Ich werde es testen und eine Antwort posten, wenn niemand anderes will. Danke auch für den Vorschlag. – Umibozu

+0

mein Ergebnis zeigte, dass es: a, b, Flagge, fag, c, d, e, f, g .... so habe ich keine Ihrer Alternativen .... – D3181

Antwort

0

Es sollte keine Notwendigkeit readline() zu verwenden. Probieren Sie es wie folgt aus:

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 

Dies erledigt alles mit den if Aussagen in der richtigen Reihenfolge, so dass Sie nur laufen nacheinander durch die Datei in einem Rutsch. Sie könnten natürlich weitere Operationen hinzufügen und Dinge mit den Ergebnissen machen, zum Beispiel indem Sie sie an eine Liste anhängen, wenn Sie erwarten, dass mehrere Start- und Ende-Flags angezeigt werden.

+0

Der allgemeine Konsens scheint nicht zu mischen der For-Schleife-Iterator und die Readline-Funktion wie Blcknght sagte. Danke für den Beitrag von allen. – Umibozu

+1

Im Allgemeinen ist es sehr schwierig, sich mit der Reihenfolge des Lesens durch eine Datei zu befassen. Wenn Sie es auf einfache, sequenzielle Weise leicht machen können, machen Sie es wahrscheinlich richtig. – Jeff

0

Verwendung dieser:

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 
Verwandte Themen