2017-07-24 3 views
0

Ich versuche herauszufinden, wie Sie 3 Zeilen vor und nach einem übereinstimmenden Wort extrahieren.Python, Extrahieren 3 Zeilen vor und nach einem Spiel

Im Moment ist mein Wort gefunden. Ich habe einen Text geschrieben, um meinen Code zu testen. Und ich habe herausgefunden, wie ich nach meinem Match drei Zeilen drucken kann.

Aber ich habe Schwierigkeiten, herauszufinden, wie drei Zeilen vor dem Wort "secure" zu drucken. Hier

ist das, was ich bisher:

from itertools import islice 
with open("testdoc.txt", "r") as f: 
for line in f: 
    if "secure" in line: 
     print("".join(line)) 
     print ("".join(islice(f,3))) 

Hier ist der Text, den ich für den Test erstellt:

---------------------------- 
This is a test to see 
if i can extract information 
using this code 
I hope, I try, 
maybe secure shell will save thee 
Im adding extra lines to see my output 
hoping that it comes out correctly 
boy im tired, sleep is nice 
until then, time will suffice 
+0

Was Sie bisher versucht haben, das nicht funktioniert? Ich sehe keinen Versuch, vorher gelesene Zeilen zu behalten, falls sie benötigt werden, wenn Ihr Schlüsselwort gefunden wird. – Aaron

Antwort

0

Sie benötigen Linien zu puffern, damit Sie sie erinnern kann. Der einfachste Weg ist, einfach alle Zeilen in eine Liste zu laden:

with open("testdoc.txt", "r") as f: 
    lines = f.readlines() # read all lines into a list 
    for index, line in enumerate(lines): # enumerate the list and loop through it 
     if "secure" in line: # check if the current line has your substring 
      print(line.rstrip()) # print the current line (stripped off whitespace) 
      print("".join(lines[max(0,index-3):index])) # print three lines preceeding it 

Aber wenn Sie maximale Speichereffizienz benötigen, können Sie einen Puffer verwenden, um die letzten drei Zeilen, wie Sie Schleife über die Datei Zeile für Zeile zu speichern. A collections.deque ist dafür ideal.

1

ich kam mit dieser Lösung nach oben, nur um die vorherigen Zeilen in einer Liste hinzugefügt, und die ersten nach 4 Löschen von Elementen

from itertools import islice 

with open("testdoc.txt", "r") as f: 
    linesBefore = list() 
    for line in f: 
     linesBefore.append(line.rstrip()) 
     if len(linesBefore) > 4: #Adding up to 4 lines 
      linesBefore.pop(0) 
     if "secure" in line: 
      if len(linesBefore) == 4: # if there are at least 3 lines before the match 
       for i in range(3): 
        print(linesBefore[i]) 
      else: #if there are less than 3 lines before the match 
       print(''.join(linesBefore)) 
      print("".join(line.rstrip())) 
      print ("".join(islice(f,3))) 
+0

Danke! Ich nehme an, dass linesBefore.pop die ausgewählten Zeilen nach oben bewegt? – jrooz

+0

'LinesBefore' speichert 3 Zeilen vor und die aktuelle Zeile, sobald sie eine weitere Zeile hinzufügt,' linesBefore.pop (0) 'lösche das erste Element in der Liste und lasse die 3 Zeilen vor und die aktuelle Zeile wieder –

Verwandte Themen