2016-11-07 3 views
2

Ich versuche, den Inhalt einer Datei mit dem Inhalt eines anderen unterteilen. Datei1 enthält einen einzigen Wert pro Zeile:Subset Inhalt einer Datei basierend auf Inhalt eines anderen

43 
44 
101 

File2 enthält zwei Werte pro Zeile, sind Werte, die durch ein Leerzeichen getrennt:

43 48 
43 54 
44 12 
88 55 
101 31 
101 56 
101 61 

Ich möchte den Inhalt File2 filtern basierend auf den Inhalten Wenn der erste Wert in einer beliebigen Zeile von Datei2 mit einem Wert in Datei1 übereinstimmt, wird die Zeile aus Datei2 in eine neue Datei gedruckt. Einige Zeilen in Datei2 sollten nicht in der neuen Datei enthalten sein (Wert existiert nicht in Datei1), und einige Werte aus Datei1 haben mehrere Einträge in Datei2. Die Ausgabe sollte so aussehen:

43 48 
43 54 
44 12 
101 31 
101 56 
101 61 

Ich habe versucht, den Code für diese Aufgabe in Python zu arbeiten. Ich bin relativ neu in dieser Sprache, aber hier ist etwas, was ich versucht habe, so weit:

output=open("new_file.txt","a") 

for i in file2: 
    key="%s" % (i.split()[0]) 
    if key in file1: 
     output.write(i) 

Irgendwelche Tipps, wie dieser Code funktionsfähig zu machen? Vielen Dank!

+0

Hinweis: zuerst Datei1 laden und die Daten in eine O (1) Suche (wahrscheinlich gesetzt oder Wörterbuch), dann für jede Zeile in Datei2, (1) teilen Sie die Zeile auf dem Raum, (2) prüfen, ob der erste Teil ist in Ihrem Set/Dictionary, (3) wenn ja, schreiben Sie in die Ausgabedatei. –

Antwort

0

Zunächst einig Logik implementieren für alle Zahlen in der ersten Datei in einen Satz zu machen (dieser Code sich als Strings hält, keine Zahlen, aber das ist weitgehend irrelevant):

nums = set() 
with open("file1.txt") as file1: 
    for line in file1: 
     nums.add(line.strip()) 

Als nächst wir habe den Code zum Filtern jeder Zeile in der zweiten Datei. Wir können zur gleichen Zeit in die finale Datei ausgeben oder einfach alles temporär speichern und später machen. Dieser Code tut es zur gleichen Zeit:

with open("file2.txt") as file2, open("output.txt", "wt") as output: 
    for line in file2: 
     to_check = line.strip().split()[0] 
     if to_check in nums: 
      print(line.strip(), file=output) 

Und das sollte den Trick tun. Ich habe es mit dem, was du geliefert hast, getestet und es scheint das gewünschte Ergebnis zu geben, aber lass es mich wissen, wenn es nicht das tut, was du erwartest.

+0

Das funktioniert perfekt, vielen Dank für die schnelle Antwort! Der Code ist auch logisch sinnvoll. Danke noch einmal! – nrcombs

+0

@nrcombs Kein Problem! Würde es Ihnen etwas ausmachen, dies als die richtige Antwort zu markieren, wenn es Ihnen hilft? – user3030010

0

Ich würde es so aus der ersten Datei lese

tun
with open('file1.txt') as f1: 
    set1 = [line.strip() for line in f1] 

with open('file2.txt') as f2: 
    vals = [[val for val in line.split()] for line in f2] 

with open('out.txt', 'w') as fout: 
    for val in vals:   
     if val[0] in set1: 
      fout.write(' '.join(val) + '\n') 

in eine Liste und die zweite Datei in eine verschachtelte Liste. Durchlaufen Sie dann die file2-Werte und prüfen Sie, ob der erste Eintrag in der Liste von Datei 1 enthalten ist. Wenn Sie viele Werte verarbeitet haben, können Sie set1set verwenden, um die Suche von linearer zu konstanter Zeit zu verbessern. Für eine kleine Anzahl von Werten ist es jedoch möglicherweise nicht der Overhead wert.

+0

Ausgezeichnet, funktioniert super. Danke für die Antwort! Hilfreich, um die verschiedenen Ansätze für diese Aufgabe zu sehen. – nrcombs

+0

großartig. Vergessen Sie nicht, Ihre bevorzugte Antwort auszuwählen und als akzeptiert zu markieren. –

Verwandte Themen