@mapo: Der Code ist wenig übersichtlich geschrieben. Da solltest Du dran arbeiten. Zum Beispiel nicht eine Datei öffnen, einen csv-Reader erstellen und dann über die Hälfte der Programmzeilen die gar nichts damit machen, und dann erst der Code der das tatsächlich benutzt.
Bei der einen Datei verwendest Du ``with``, bei der anderen nicht. Warum? Die wird nicht sauber geschlossen. Nicht einmal mit einem manuellen `close()`.
Beim lesen von ``TestdatenO.csv`` wird am Ende ausschlieslich der letzte Eintrag in `kontakte` eingetragen, weil das *hinter* der Schleife steht und nicht im Schleifenkörper. Falls die Datei ausser der Kopfzeile leer ist, führt das zudem zu einer Ausnahme weil `eintrag` dann undefiniert ist. Ich vermute mal das sollte *in* die Schleife.
Dann lassen sich da benannte Zwischenergebnisse einfach einsetzen, und dann kann man aus der Schleife eine einfache „dict comprehension“ machen.
Beim Verarbeiten von ``MAListeV.csv`` ist wieder das gleiche Problem: Du prüfst *nach* der Schleife etwas mit dem letzten Datensatz aus der Datei was wohl für *jeden* Datensatz geprüft werden sollte. Und Du tust das mit einer Schleifenvariablen aus der Verarbeitung der vorhergehenden Datei, also auch wieder nur mit dem letzten Datensatz und den Namen `zeile` gibt es da auch nur falls die Schleife der ersten Datei tatsächlich mindestens einmal durchlaufen wurde. Sonst gibt es eine Ausnahme weil der Name nicht definiert ist.
Der Test mit ``in`` ist ziemlich sicher falsch, denn Du willst ja nicht wissen ob eine E-Mail *in* einer anderen enthalten ist, sondern ob die *gleich* sind. E-Mail-Adressen können auch in anderen E-Mail-Adressen enthalten sein und unterschiedlich sein.
Nicht funktionierender Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import csv
import json
def main():
with open(
"TestdatenO.csv", "r", newline="", encoding="utf-8"
) as csv_datei:
dialect = csv.Sniffer().sniff(csv_datei.readline())
csv_datei.seek(0)
reader = csv.reader(csv_datei, dialect)
kopfzeile = next(reader)
kontakte = {
f" {zeile[1]}": {kopfzeile[1]: zeile[1]} for zeile in reader
}
print(json.dumps(kontakte, indent=4))
with open("MAListeV.csv", "r", newline="", encoding="utf-8") as file:
daten_csv = csv.DictReader(file, delimiter=",")
for row in daten_csv:
print(row["Email"])
#
# FIXME `zeile` gibt es hier nicht, und es würde auch keinen Sinn
# machen sich hier auf eine *möglicherweise* existierende
# Laufvariable aus einer vorher bereits beendeten Schleife zu
# beziehen.
#
if zeile[1] == row["Email"]:
print("Funktioniert")
if __name__ == "__main__":
main()
Eine doppelt verschachtelte Schleife würde wahrscheinlich funktionieren, hätte aber ein gruseliges Laufzeitverhalten. Man würde erst eine der Dateien einlesen und dort die E-Mail-Adresse(n) in einem Wörterbuch jeweils auf den Datensatz abbilden. Die sind hoffentlich eindeutig?
Und dann liest man die andere Datei ein und hat ja bereits das Wörterbuch mit dem man eine E-Mail-Adresse auf den dazugehörigen Datensatz der anderen Datei abbilden kann.