2 CSV Datei - gleiche und verschiedene Daten exportieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Peer
User
Beiträge: 6
Registriert: Donnerstag 14. September 2017, 10:19

Hallo,
ich bin neu in Python und möchte 2 CSV Datein vergleichen und in jeweils einer extra Datei die gleichen Datensätze und die unterschiedlichen Datensätze exportieren und speichern
Nur leider speichert der die Listen immer 1:1 (also es wird nichts verglichen) hab schon 2x verschiedene Logis versucht.

Test1.csv =
test;test1;test2;test3;test4
test0;test01

Test2.csv =
test5;test6;test7;test8;test4
test9;test10;test11

Am Ende will ich eine Liste mit Test4 und eine Liste mit den restlichen Test haben

Code: Alles auswählen

import csv

output_path1 = "server_fertig1.csv" #1 Logikversuch
output_path2 = "server_fertig2.csv" #1 Logikversuch
output_path3 = "server_fertig3.csv" #2 Logikversuch
output_path4 = "server_fertig4.csv" #2 Logikversuch

f1 = open("test1.csv") #File Nr1 einlesen
oldFile1 = csv.reader(f1, delimiter=';')
oldList1 = list(oldFile1)

f2 = open("test2.csv") #File Nr2 einlesen
oldFile2 = csv.reader(f2, delimiter=';')
oldList2 = list(oldFile2)

f1.close() #File Nr1 schließen
f2.close() #File Nr2 schließen

#1 Logikversuch
output1 = [row for row in oldList1 if row not in oldList2]
output2 = [row for row in oldList1 if row in oldList2]

#verschiedene Daten
with open(output_path1,'w', newline='') as fout1:
    writer = csv.writer(fout1, delimiter=';')
    writer.writerows(output1)
#gleiche Daten
with open(output_path2, 'w', newline='') as fout2:
    writer = csv.writer(fout2, delimiter=';')
    writer.writerows(output2)
    
       

#2 Logikversuch
output3 = set([tuple(item) for item in oldList1])
output4 = set([tuple(item) for item in oldList2])

with open(output_path3, 'w', newline='') as fout3:
    writer = csv.writer(fout3, delimiter=';')
    writer.writerows(output3) 
with open(output_path4, 'w', newline='') as fout4:
    writer = csv.writer(fout4, delimiter=';')
    writer.writerows(output4)

print (output1)
print (output2)
print (output3)
print (output4)
[['test', 'test1', 'test2', 'test3', 'test4'], ['test0', 'test01']]
[]
{('test', 'test1', 'test2', 'test3', 'test4'), ('test0', 'test01')}
{('test9', 'test10', 'test11'), ('test5', 'test6', 'test7', 'test8', 'test4')}

Process finished with exit code 0
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peer: die Dateien sind doch verschieden, so dass alles in der ersten Liste landet und nichts in der zweiten. Was erwartest Du denn für ein Ergebnis?
Peer
User
Beiträge: 6
Registriert: Donnerstag 14. September 2017, 10:19

Die sollen auch verschieden sein bis auf "Test4" das soll als einziges in eine andere Datei


Das Ergebnis möchte ich haben - also am Ende 4 Listen statt 2

Datei1
Test1; Test2;Test3
Datei2
Test1;Test4;Test5

Export1 (sind in Datei1 & Datei 2)
Test1

Export2 (sind in Datei1 oder Datei 2)
Test2;Test3;Test4;Test5;

Export3(sind nur in Datei1)
Test2;Test3

Export4 (sind nur in Datei2)
Test4;Test5
Peer
User
Beiträge: 6
Registriert: Donnerstag 14. September 2017, 10:19

Code: Alles auswählen

import csv

output_path1 = "server_fertig1.csv" # Export 1 (Liste 1 UND Liste 2)
output_path2 = "server_fertig2.csv" # Export 2 (NUR Liste 1)

#File Nr1 einlesen
f1 = open("test1.csv")
oldFile1 = csv.reader(f1, delimiter=';')
oldList1 = list(oldFile1)

#File Nr2 einlesen
f2 = open("test2.csv")
oldFile2 = csv.reader(f2, delimiter=';')
oldList2 = list(oldFile2)

#Files Nr1 + Nr2 schließen
f1.close()
f2.close()

#1 Logikversuch
output1 = []
output2 = []
for row in oldList1:
    if row not in oldList2:
        output2.append(row)
    else:
        output1.append(row)


# Export 1 (Liste 1 UND Liste 2)
with open(output_path1,'w', newline='') as fout1:
    writer = csv.writer(fout1, delimiter=';')
    writer.writerows(output1)

# Export 2 (NUR Liste 1)
with open(output_path2, 'w', newline='') as fout2:
    writer = csv.writer(fout2, delimiter=';')
    writer.writerows(output2)

# Feedback
print (output1)
print (output2)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peer: Du willst also keinen zeilenweisen Vergleich, sondern einen zellenweisen? Aber dann pro Zeile oder pro Datei?
Peer
User
Beiträge: 6
Registriert: Donnerstag 14. September 2017, 10:19

Ich habe 2 Listen mit mehreren Zeilen und möchte die vergleichen also das ganze Dokument
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peer: ja schon klar, aber wie willst Du vergleichen? Was mit was genau?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Peer: Die Frage ist z.B., muss die Zeile _exakt_ identisch sein, oder gilt so was wie

Datei 1: foo,bar,spam,egg
Datei 2: foo,spam,egg,bar

auch als identisch?

Gruß, noisefloor
Peer
User
Beiträge: 6
Registriert: Donnerstag 14. September 2017, 10:19

noisefloor hat geschrieben: Datei 1: foo,bar,spam,egg
Datei 2: foo,spam,egg,bar

auch als identisch?
Das würde reichen -
Problem ist, dass ich 2 Listen mit mehreren Spalten habe und die in einigen Spalten gleich sind aber nicht überall
z.B
Produktname ist für jede Zeile gleich - Seriennummer aber nicht
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peer: wenn Du nicht in der Lage bist, eine klare Problembeschreibung anzugeben, wird man Dir nicht helfen können.
Peer
User
Beiträge: 6
Registriert: Donnerstag 14. September 2017, 10:19

Wo ist das ungenau ? Was brauchst du denn noch genauer ? :D
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Die einzige Aussage zu Deinem Problem war bisher:
ich [..] möchte 2 CSV Datein vergleichen und in jeweils einer extra Datei die gleichen Datensätze und die unterschiedlichen Datensätze exportieren und speichern
Die logische Interpretation ist, die Dateien Zeilenweise zu vergleichen und das hast Du mit dem ersten geposteten Code auch getan, Du warst aber mit dem Ergebnis nicht zufrieden. Seither versuche ich von Dir zu erfahren, warum Du mit Deinem ersten Ergebnis nicht zufrieden bist.

Zum Verständnis benötigt der Leser also eine klare Definition von Datensatz und von Gleichheit zweier Datensätze.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das Problem ist, dass du _uns_ nicht eindeutig klar machen kannst, _was_ du willst. Erst heißt es zeilenweise, dann zeilenweise aber Reihenfolge egal, dann (anhand des Seriennummern-Beispiels) sind bestimmte Zellen scheinbar auch egal.

Wenn du ein Problem nicht erklären kannst, dann hast du zwei Probleme. Und ziemlich sicher wirst du so auch nicht eine Lösung hier im Forum bekommen.

Gruß, noisefloor
Antworten