2017-04-24 4 views
1

Ich habe ein Python-Skript geschrieben, wo ich versuche, einige Textdateien zu filtern und sie mit einer anderen Textdatei zu vergleichen, aber ich habe Mühe, eine Lösung zu finden.Filtern nach Werten in Textliste in Python

below | 1 

above | 2 

above | 3 

above | 4 

above | 5 

below | 6 

below | 7 

below | 8 

below | 9 

below | 10 

below | 11 

below | 12 

above | 13 

below | 14 

below | 15 

below | 16 

below | 17 

below | 18 

below | 19 

below | 20 

below | 21 

... 

Ich habe diese Datei Video-Frames Auflistung und ob sie über oder unter einem definierten Schwellenwert sind.

Zusätzlich habe ich eine Liste dieser 'oben' Schwellwertrahmen und einen benutzerdefinierten Wert markiert (entweder x, y oder z) zu jedem. Leider stimmen die Nummern in dieser Liste nicht mit der ursprünglichen Ober- oder Unterrahmennummer überein, sondern sind nur eine nummerierte Liste.

y | 1 
x | 2 
x | 3 
y | 4 
z | 5 
z | 6 
y | 7 
z | 8 
y | 9 
y | 10 
x | 11 
x | 12 
y | 13 
x | 14 
x | 15 
x | 16 
x | 17 
x | 18 
y | 19 
x | 20 
z | 21 

Ich mag diese beide kombinieren, so dass die x, y oder z Werte des oben genannten Rahmen, die den ‚oben‘ Tag im anderen Skript ersetzen, wie folgt aus:

below | 1 

y | 2 

x | 3 

x | 4 

y | 5 

below | 6 

below | 7 

below | 8 

below | 9 

below | 10 

below | 11 

below | 12 

z | 13 

below | 14 

below | 15 

below | 16 

below | 17 

below | 18 

below | 19 

below | 20 

below | 21 

aber ich kann Ich verstehe nicht, wie man die Liste durchläuft, um dies zu erreichen. Sollte ich Werte in einem Wörterbuch speichern und über diese hinausgehen? Jede Hilfe würde sehr geschätzt werden. Ich habe versucht, einige für Schleifen und mit offenen Aussagen verwenden, es zu versuchen, aber ich kann meinen Kopf nicht umgehen, wie durch sie durchlaufen:

with open((selectedvideostring + 'combinedfiles.txt'), 'w') as combinedfile: 
    with open((selectedvideostring + 'aboveorbelow.txt'), 'r') as aboveorbelowfile: 
     for line in aboveorbelowfile: 
      if 'above' in line: 
       with open((selectedvideostring + 'xyzfile.txt'), 'r') as xyzfile: 
        for line in xyzfile: 
         if 'x' in line: 
          combinedfile.write("x" + '|' + str(int(cap.get(1)))) 

         elif 'y' in line: 
          combinedfile.write("y" + '|' + str(int(cap.get(1)))) 

         if 'z' in line: 
          combinedfile.write("z" + '|' + str(int(cap.get(1)))) 

      elif 'below' in line: 
       combinedfile.write("below" + '|' + str(int(cap.get(1)))) 

Dank!

+1

was haben Sie versucht schon? – Netwave

+0

Bitte fügen Sie den _content_ dieser Dateien in Ihre Frage ein, damit wir nicht alles neu eintippen müssen, um eine mögliche Lösung zu testen. –

+0

Werde das jetzt tun, Entschuldigung! – KittenMittons

Antwort

1

Anstatt die xyz-Datei innerhalb der äußeren Dateischleife zu öffnen oder zu iterieren, sollten Sie beide Dateien gleichzeitig öffnen. Dateien sind Iteratoren, Sie können also eine for-Schleife verwenden, um die Zeilen in der obigen oder untergeordneten Datei zu iterieren, und next verwenden, um nur die nächste Zeile aus der xyz-Datei zu erhalten, wenn Sie einen "über" -Eintrag eingeben.

with open("aboveorbelow.txt") as aob, open("xyzfile.txt") as xyz: 
    for line in aob: 
     if line.startswith("above"): 
      ab, c = line.split(" | ") 
      d, _ = next(xyz).split(" | ") 
      print(" | ".join((d, c))) 
     elif line.startswith("below"): 
      print(line) 

(Mit print zur Vereinfachung der Tests, aber natürlich die gleichen Arbeiten mit einer Ausgabedatei.)

+0

Danke für die Hilfe! Ein kleines Problem, diesen Code in meinem Programm implementierend, erhalte ich einen Fehler, "StopIteration" lesend, den Fehler auf der Linie "d, _ = nächstes (xyz) .split (" | ")" – KittenMittons

+0

@KittenMittons werfend, in diesem Fall, es gibt nicht genug 'xyz' Werte in Ihrer zweiten Datei. Sie können 'next' mit einem Standardwert verwenden, wenn ein verwendbarer Standardwert existiert, z. 'next (xyz," UNKNOWN | 0 "). split (" | ")'. –

+0

Vielen Dank - das hat das StopIteration-Problem gestoppt - wenn ich diese print-Anweisungen wie oben verwende, gibt es genau das aus, was ich will, aber wenn ich versuche, diese Zeilen in eine neue Ausgabedatei zu schreiben, schließt es ohne Fehler ab Datei existiert - Ich füge den Code, den ich benutze, als implementiert in die ursprüngliche Frage ein, ich muss etwas falsch machen – KittenMittons

Verwandte Themen