2017-02-05 2 views
0

Ich versuche, 2 CSV-Dateien zu vergleichen, um die Unterschiede zu finden. Diese 2-Dateien wie folgt aussehen:Regex suchen und anhängen

['John'], ['Johnson'], ['[email protected]'] 
['Steve'], ['Stevens'], ['[email protected]'] 
['Sarah'], ['Stevens'], ['[email protected]'] 

und

['John'], ['Johnson'], ['[email protected]'] 
... 
['Richard'], ['McBait'], ['[email protected]'] 

Was ich versuche, diese 2-Dateien zu tun ist, ohne temporäre Dateien zu erstellen, die zu vergleichen. Das Skript sollte die Zeichen [, ' und ausschließen, die Werte lesen und dann zwei Dateien miteinander vergleichen können, die die "neuen Benutzer" darstellen.

ich dieses Problem lösen mit dieser (wahrscheinlich falsch) Logik:

read the file -> execute subprocess (tr -d \[\]\') -> save output to file1_temp -> read the file1_temp -> convert to set -> compare (.difference) with file2_tmp 

Also, die Frage ist, gibt es eine schnellere Möglichkeit, dieses Problem zu lösen? Zum Beispiel wie in Perl, indem Sie if line regex verwenden, um zu bestimmen, welche Daten gelesen werden.

+1

Werden beide Dateien in den Speicher passen? Wird der Vergleich zeilenweise ausgeführt, z. B., dass Zeile 1 von Datei A mit Zeile 1 von Datei B oder Zeile in der Datei verglichen wird? –

+0

Ich weiß es nicht wirklich, aber wir schlagen vor, dass diese CSV-Dateien 300-400 Zeilen enthalten. In meinem Fall weiß ich, dass neue Benutzer am Ende der Datei hinzugefügt werden, der zeilenweise Vergleich ist aber auch OK, ich lerne gerade. –

+0

Um das gleiche (nicht reale Welt-Szenario) -Problem in Perl zu lösen, habe ich die Zeile regex verwendet, bevor ich Daten in den Hashwert eingegeben habe. –

Antwort

0

['John'], ['Johnson'], ['[email protected]'] 

und

['John'], ['Johnson'], ['[email protected]'] 

ist nicht der gleiche Benutzer in Ihrem Fall, lädt jede CSV-Datei in einer Liste (im Speicher) und erhält das Delta dieser beiden Listen Unter der Annahme (mit einstellen).

file1.csv:

['John'], ['Johnson'], ['[email protected]'] 
['Steve'], ['Stevens'], ['[email protected]'] 
['Sarah'], ['Stevens'], ['[email protected]'] 

file2.csv:

['John'], ['Johnson'], ['[email protected]'] 
['Steve'], ['Stevens'], ['[email protected]'] 
['Richard'], ['McBait'], ['[email protected]'] 

Hier ist der Code:

>>> import csv 
>>> with open('file1.csv') as f: 
...  reader = csv.reader(f) 
...  list1 = map(tuple, reader) 
... 
>>> with open('file2.csv') as f: 
...  reader = csv.reader(f) 
...  list2 = map(tuple, reader) 
... 
>>> delta = list(set(list2) - set(list1)) 
>>> print delta 
[("['Sarah']", " ['Stevens']", " ['[email protected]']")] 
>>> clean_delta = [tuple(x.strip().strip('[\'\']') for x in y) for y in delta] 
>>> print clean_delta 
[('Sarah', 'Stevens', '[email protected]')] 
+0

Was für eine schöne Lösung, danke. –

+0

Sonderzeichen werden jedoch immer noch von Python gelesen, ich meine ''' '' '' ' –

+1

clean_delta = [tuple (x.strip(). Strip (' [\ '\'] ') für x in y) für y in delta] –