2017-08-25 9 views
2

ich eine Textdatei haben viele Daten enthält, die etwa wie folgt aussieht:Python analysieren nur bestimmte Teile der Textdatei

logstart . . . 
(chunk of data) 
logend . . . 
logstart . . . 
(chunk of data) 
logend . . . 
times 
logstart . . . 
(chunk of data) 
logend . . . 
times 
logstart . . . 
(chunk of data) 
logend . . . 

ich meine Python-Code, dass die Datei zu öffnen und die Datenblöcke zu lesen, wenn und nur wenn "mal" direkt unter dem "logend" steht. Wenn es für diesen Block keine Zeiten gibt, möchte ich, dass er ihn ignoriert. Und wenn es die richtigen Datenblöcke liest, möchte ich auch, dass es die damit verbundenen Zeiten liest.

Das ist, was ich hatte, bevor ich merkte, ich nur die bestimmte Teile extrahieren benötigt (die die gesamte Textdatei als ‚Linien‘ gespeichert):

lines = [] 
with open(filename, 'rt') as in_file: 
    for line in in_file: 
     lines.append(line) 

Wie kann ich das ändern, so dass ‚Linien‘ sind jetzt nur diese spezifischen Teile der Datei?

+1

Verwendung von Regex scheint angezeigt, zusammen mit 're.findall'. – FabienP

+1

Bitte posten Sie weitere Informationen. Ein Beispiel für einen Log-Chunk, zusammen mit dem, was Sie erfassen möchten, würde helfen. – Solaxun

+0

Ich verwende Regex, um die spezifischen Daten zu extrahieren, die ich innerhalb der Datenblöcke brauche (da ich nur etwas davon brauche). Aber mein derzeitiges Problem ist es, den Rest meines Codes nur auf die Daten für die spezifischen Teile der Datei anzuwenden, denen "Zeiten" zugeordnet sind. –

Antwort

2

Etwas wie folgt aus:

lines = [] 
with open(filename, 'rt') as in_file: 
    chunk = [] 
    for line in in_file: 
     chunk.append(line) 
     if(line.find('times')>=0): 
      lines.extend(chunk) 
     if(line.find('logstart')>=0): 
      chunk = [] 
+0

Diese Lösung enthält auch die Zeilen "mal", "logstart" und "logend". OP war nicht klar, ob sie das wollten. – tdube

+0

Auch müssen Sie 'True' und' False' verwenden. – tdube

+0

Ja, es ist in Ordnung, wenn es diese Zeilen enthält, weil ich später sowieso Regex mache. Allerdings funktioniert diese Lösung nicht für mich - ich bekomme einen AttributeError: 'str' -Objekt hat kein Attribut 'contains' –

0

Sie können dies tun, indem Spur eines kleinen Staates zu halten.

lines = [] 
with open(filename, 'rt') as in_file: 
    in_log = False 
    save = [] 
    for line in in_file: 
     if 'logend' in line: 
      in_log = False 
     if in_log: 
      save.append(line) 
     if 'times' in line: 
      save.append(line) 
      lines.extend(save) 
     elif 'logstart' in line: 
      in_log = True 
      save = [] 
+0

Danke, obwohl ein paar Probleme, mit denen ich konfrontiert bin - ich denke, dieser Code ist die Auswahl der Daten, die unter den "Zeiten" sind, aber ich will nur diejenigen, die oben sind, wo immer "Zeiten" sind. Ich möchte auch, dass die "Zeiten" selbst gezeigt werden. –

+0

@WynneT Aktualisierte Antwort basierend auf Ihrem Feedback. – tdube

Verwandte Themen