2017-06-19 2 views
0

Ich habe Daten wie die Beispieldaten unten in einer Textdatei. Was ich tun möchte, ist, die Textdatei zu durchsuchen und alles zwischen "SpecialStuff" und dem nächsten ";" zurückzugeben, wie ich es mit dem Beispieloutput gemacht habe. Ich bin ziemlich neu zu Python, so dass alle Tipps sehr geschätzt werden, würde etwas wie .split() funktionieren?Parse Text mit Python

Example Data: 

stuff: 
    1 
    1 
    1 
    23 

]; 

otherstuff: 
    do something 
    23 
    4 
    1 

]; 

SpecialStuff 
    select 
     numbers 
     ,othernumbers 
     words 
; 

MoreOtherStuff 
randomstuff 
@#123 


Example Out Put: 

select 
     numbers 
     ,othernumbers 
     words 

Antwort

1

Sie können dies versuchen:

file = open("filename.txt", "r") # This opens the original file 
output = open("result.txt", "w") # This opens a new file to write to 
seenSpecialStuff = 0 # This will keep track of whether or not the 'SpecialStuff' line has been seen. 
for line in file: 
    if ";" in line: 
     seenSpecialStuff = 0 # Set tracker to 0 if it sees a semicolon. 
    if seenSpecialStuff == 1: 
     output.write(line) # Print if tracker is active 
    if "SpecialStuff" in line: 
     seenSpecialStuff = 1 # Set tracker to 1 when SpecialStuff is seen 

Diese eine Datei namens result.txt zurückgibt, enthält:

select 
    numbers 
    ,othernumbers 
    words 

Dieser Code kann verbessert werden! Da dies wahrscheinlich eine Hausaufgabe ist, werden Sie wahrscheinlich mehr darüber recherchieren wollen, wie Sie dies effizienter machen können. Hoffentlich kann es ein nützlicher Ausgangspunkt für Sie sein!

Prost!

EDIT

Wenn Sie den Code, um speziell lesen Sie die Zeile „SpecialStuff“ (anstelle von Linien enthalten „SpecialStuff“) wollte, könnte man leicht die „if“ Anweisungen ändern, um sie präziser :

file = open("my.txt", "r") 
output = open("result.txt", "w") 
seenSpecialStuff = 0 
for line in file: 
    if line.replace("\n", "") == ";": 
     seenSpecialStuff = 0 
    if seenSpecialStuff == 1: 
     output.write(line) 
    if line.replace("\n", "") == "SpecialStuff": 
     seenSpecialStuff = 1 
+0

Danke, das ist wirklich nah an dem, was ich gesucht habe. Das einzige Problem ist, dass es einige Teile des Codes gibt, die Zeichenfolgen wie "abcSpecialStuffpdq" haben, und so ergreift es alles, was folgt. Wie kann ich den Code ändern, sodass er nur nach der Zeichenfolge "SpecialStuff" verwendet wird? – user3476463

+0

Sie können versuchen, die "if" -Anweisung so zu machen wie 'if line.replace (" \ n "," ") ==" SpecialStuff ":', das würde es so machen, dass nur die Zeile, die genau SpecialStuff enthält, es wäre triggert den Tracker "1"! Das kann auch für die anderen Zeilen gemacht werden, wenn Sie nur bestimmte Vorkommen finden wollen! – cosinepenguin

+0

Ich habe die Antwort bearbeitet, um das zu reflektieren! Wenn Sie später auch die in "abcSpecialStuffpdq" enthaltenen Informationen abrufen müssten, müssten Sie eine separate "if" -Anweisung hinzufügen, damit der Code sie erkennt. – cosinepenguin

0
with open('path/to/input') as infile, open('path/to/output', 'w') as outfile: # open the input and output files 
    wanted = False # do we want the current line in the output? 
    for line in infile: 
     if line.strip() == "SpecialStuff": # marks the begining of a wanted block 
      wanted = True 
      continue 
     if line.strip() == ";" and wanted: # marks the end of a wanted block 
      wanted = False 
      continue 

     if wanted: outfile.write(line) 
0

Sie str.split() nicht für diese Verwendung - str.find() ist mehr als genug:

parsed = None 
with open("example.dat", "r") as f: 
    data = f.read() # load the file into memory for convinience 
    start_index = data.find("SpecialStuff") # find the beginning of your block 
    if start_index != -1: 
     end_index = data.find(";", start_index) # find the end of the block 
     if end_index != -1: 
      parsed = data[start_index + 12:end_index] # grab everything in between 
if parsed is None: 
    print("`SpecialStuff` Block not found") 
else: 
    print(parsed) 

Beachten Sie, dass diese alles zwischen diesen beiden erfassen wird, neue Linien und andere Leerzeichen inklusive - Sie können zusätzlich parsed.strip() tun Vorder- und Hinter Leerzeichen zu entfernen, wenn Sie sie nicht wollen.