2016-04-16 3 views
0

Ich versuche, die erste Zeile aus einer Datei zu lesen, die zu einem bestimmten Format ich angegeben entspricht.Python: gelesen, bis die erste richtig formatierte Zeile, fangen, wenn es keine gibt

Ich habe eine Methode self.parse_log_line(line), die ein Objekt zurückgibt, wenn die Datei ordnungsgemäß analysiert wurde, andernfalls gibt None zurück.

Also habe ich versucht, jede Zeile nur zu lesen und analysieren, bis ich etwas nicht-None erhalten:

with open(filename, 'r') as csv_file: 
    line = csv_file.readline() 
    info = self.parse_log_line(line) #parse it, None if the line isn't formatted properly 
    while info is None: 
     line = csv_file.readline() 
     info = self.parse_log_line(line) 
    # if info is still none, do something to handle that 

jedoch aus irgendeinem Grund dieser Schleifen infinitly. Einige Dateien können leer sein oder keine korrekt formatierten Zeilen enthalten.

Wie kann ich das beheben? Gelesen, bis ich eine richtig formatierte Linie bekomme, und wenn es keine gibt, etwas anderes tun?

+0

Warum durchlaufen Sie nicht einfach Ihre Datei, bis Sie gefunden haben, was Sie suchen. Sobald Sie die Datei erschöpft haben und es keine gibt, fahren Sie mit dieser Bedingung fort? Die Verwendung einer while-Schleife auf diese Weise ist ziemlich gefährlich, gerade weil es in einer Endlosschleife weiterlaufen wird, wie Sie gerade erleben. – idjaw

+1

Hmm, ja, warum nicht ich? Ich versuche es jetzt: D –

+0

Ok, Idjaw, das funktioniert. Ich benutze jetzt 'für Zeile in csv_file:' und führe das Parsing dort durch. Dann einfach "brechen", sobald ich die erste richtige Linie gefunden habe. Wenn Sie das als Antwort hinzufügen, kann ich es akzeptieren;) –

Antwort

3

Ein besserer und sicherer Ansatz hier wäre, durch Ihre Datei zu iterieren, bis Sie das finden, was Sie suchen. Zum Beispiel so etwas wie:

with open('your_file') as f: 
    for line in f: 
     # do your logic here 

# check for your `None` match here 

Sobald Sie die Datei erschöpft haben, und Sie finden eine None, gehen Sie mit Ihrem None Spiel Zustand.

Die Verwendung einer while-Schleife auf diese Weise ist ziemlich gefährlich, gerade weil es in einer Endlosschleife weiterlaufen kann, wie Sie gerade erleben.

+1

Ich dachte genau das gleiche und dann scrollte ich runter und sah das :) – Jonathan

0

Sie müssen auch überprüfen, ob es eine Zeile zu lesen gibt (was ist, wenn es nicht mehr zu lesen gibt und Sie noch lesen - Endlosschleife).

+0

Werfen Sie einen Blick auf die Logik in Ihrer While-Schleife. Es ist nicht korrekt. Ihre if-Anweisung ist sinnlos, weil sie dieselbe Bedingung wie die while-Schleife testet. Die if-Anweisung wird also einmal ausgeführt und dann beendet, wenn Sie in der ersten Zeile nicht finden, wonach Sie suchen. – Jonathan

+0

Nein @ Jonathan, die While-Schleife testet, ob 'info' None ist. 'info' kann None sein, wenn das Parsen von' line' fehlschlägt, auch wenn 'line' von' None' abweicht (vielleicht hat die Zeile nicht das richtige Format). Wieder prüft die While-Schleife Informationen und das if überprüft die Zeile. –

Verwandte Themen