2016-03-23 10 views
0

ich eine Log-Datei haben, ist diese Datei wie folgt aus:Spiel Zeichen in einer Zeile und drucken Sie die Zeile vor Python

line1 Eingang

line2 Ausgang

line3 Eingang

line4 Ausgabe

und so weiter ...

Basierend auf dem Ausgang I Ein- und Ausgabe in eine neue Datei extrahieren .. Ich möchte verwendet

Als Beispielcode Druck und die Methode .startswith, und das ist für mich in Ordnung, weil ich nur daran interessiert bin Wie kann ich die aktuelle Zeile in eine Datei und die Zeile davor ziehen.

Hier ist, wie ich getan habe:

file = 'path_to_file' 
index_list = [] 
line_list = [] 

with open(file) as f: 
    for index, line in enumerate(f): 
     line_list.append(line) 
     if line.startswith('b'): 
      index_list.append(index) 


for index in index_list: 
    print line_list[index-1], line_list[index] 

Dieser Code funktioniert gut, aber ich fragte mich, ob es eine pythonic Art und Weise, es zu tun, spart Speicher.

Vielen Dank im Voraus.

BR

Antwort

1

, ohne mehr als zwei Zeilen im Speicher zu speichern:

from itertools import izip 

with open('test.log') as lines: 
    for input_line, output_line in izip(lines): 
     if output_line.startswith('b'): 
      print input_line 
      print output_line 

es in eine Funktion gesetzt und ersetzen print durch yield und man file.writelines() mit dieser Funktion kann nur die passenden Eingangs-/Ausgangspaare schreiben.

0

den folgenden Code Verwenden Sie die Zeilen einer Datei in einer Liste zu erhalten. Dann können Sie die Zeile und die vorherige Zeile einfach abrufen. Ich schlage auch vor, dies nicht in der REPL auszuführen, da eine große Protokolldatei die python REPL verlangsamen könnte.

with open(fileName) as file: 
    content = file.readlines() 

Hoffe das hilft.

+0

Eine große Protokolldatei kann nicht nur die REPL verlangsamen, sondern auch jedes Programm, das die gesamte Datei in den Speicher liest. Selbst die gesamte Systemleistung könnte leiden, wenn der Prozess zu tauschen beginnt. – BlackJack

Verwandte Themen