Seite 1 von 1

Spezifische Reihe durch append einfügen

Verfasst: Donnerstag 18. November 2021, 08:34
von _corn_
Guten Morgen Zusammen,

Das Programm läuft eigentlich so, wie ich es mir vorstelle.

Code: Alles auswählen

import csv

f = open('liste.csv', 'r', encoding='utf-8')

liste = csv.DictReader(f, delimiter=';')
lookup_data = {}
for row in liste:
    lookup_data[row['E-Mail']] = row
    
with open('Daten.csv', 'r', encoding='utf-8', newline='') as csv_datei:
    reader = csv.reader(csv_datei, delimiter=',')
   
    kopfzeile = next(reader)
    
  
    for zeile in reader:
        if zeile[1] in lookup_data:
           print(zeile[1])
           print("Gefunden")
           with open ('Final.csv', 'a', encoding='utf-8', newline='') as csv_schreiben:
            eintrag = zeile
            writer = csv.writer(csv_schreiben, dialect='excel')
            eintrag.append(lookup_data)
            writer.writerow(eintrag)
            
        else:
            print(zeile[1])
            print("Fehler: Mitarbeiter nicht in Liste gefunden")
            
Nun brauch ich jedoch hilfe in der if-schleife. Ich will nun das eine Information aus der liste in die Finale-Datei geschrieben wird. Momentan schreibt er dort leider die ganze Liste rein. Es soll sowohl nur eine Info aus der Datei sein, sowie aus der richtigen Spalte (d.h. von der mit der gleichen E-Mail). Habe ich ein Grundliegenden Fehler mit der append herangehensweise oder wie kann ich dort die spezifische Information rein bringen. Ich würde mich wie immer über Korrektueren, Vorschläge und Tipps freuen, da ich noch komplett am Anfang bin.

LG Corn

Re: Spezifische Reihe durch append einfügen

Verfasst: Donnerstag 18. November 2021, 09:00
von noisefloor
Hallo,

mit der Zeile `eintrag.append(lookup_data)` hängst du an die Liste `eintrag` das _komplette_ Dict `lookup_data`. Wenn du nur einzelne Einträge schreiben willst, muss du halt auf den entsprechende Schlüssel im Dict zugreifen.

Ansonsten:
* `f` wird nur geöffnet, nicht geschlossen. Kann gut gehen, muss aber nicht. Warum benutzt du hier nicht auch den Context-Manager mit `with open(...)`?
* im unteren Teil des Codes stimmt die Reihenfolge nicht bzw. ist ungünstig. Warum öffnest du mit jedem Schleifendurchlauf die Datei `Final.csv`. Besser ist: erst öffnen, dann die Instanz des csv-Writers anlegen, dann die Schleife zum Befüllen der Datei.

Gruß, noisefloor

Re: Spezifische Reihe durch append einfügen

Verfasst: Donnerstag 18. November 2021, 09:10
von _corn_
@noisefloor Vielen Dank erstmal für die Tipps. Wenn ich nicht das komplette dict sondern auf den Entsprechenden Key zugreifen will, gibt er mir immer einen KeyError mit der Information aus der letzten Reihe. Meine Vermutung ist jedoch, wenn ich das so mache, dass er mir dann nicht die Value reinschreibt die mit der Mail von der anderen Datei nicht übereinstimmt. Ich habe jetzt vielleicht an Tuple oder ähnliches gedacht, womit ich die Einträge verbinden kann und dann abrufen kann. Geht das in die richtige Richtung und wie würde man sowas grob machen?

LG Corn

Re: Spezifische Reihe durch append einfügen

Verfasst: Donnerstag 18. November 2021, 09:42
von Sirius3
Diese Frage schließt doch genau an diesen Thread an (viewtopic.php?f=1&t=53431&p=396276#p396276). Warum machst Du einen neuen auf?

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4, mal 3, mal 2 und mal nur einer.

if-Schleifen gibt es nicht. Ein if ist nur eine Verzweigung.
Warum öffnest Du die selbe Datei in jedem Schleifendurchgang, statt nur einmal außerhalb der Schleife?

`csv_schreiben` ist eine Tätigkeit, Du nennst aber eine Variable so.
Warum nennst Du zeile in eintrag um?
Listen sollte man nicht verändern, sondern neue Listen erzeugen.
Der Code ist zu lang, der sollte in mehrere Funktionen aufgeteilt werden.

Code: Alles auswählen

import csv

def read_emails(filename):
    with open(filename, encoding='utf-8', newline='') as csv_datei:
        reader = csv.DictReader(f, delimiter=';')
        lookup_email = {}
        for row in reader:
            lookup_email[row['E-Mail']] = row
    return lookup_email


def main():
    emails = read_emails('liste.csv')
    with open('Daten.csv', encoding='utf-8', newline='') as csv_input:
        reader = csv.reader(csv_input, delimiter=',')
        kopfzeile = next(reader)
        with open('Final.csv', 'a', encoding='utf-8', newline='') as csv_output:
            writer = csv.writer(csv_output, dialect='excel')
            for zeile in reader:
                email = zeile[1]
                if email in emails:
                    print(f"Gefunden: {email}")
                    writer.writerow(zeile + emails[email])
                else:
                    print(f"Fehler: Mitarbeiter nicht in Liste gefunden ({email})")

if __name__ == "__main__":
    main()

Re: Spezifische Reihe durch append einfügen

Verfasst: Donnerstag 18. November 2021, 10:17
von noisefloor
Hallo,

wenn du einen `KeyError` bekommst, dann gibt es halt den Schlüssel nicht, den du angibst. Da wir deine Daten nicht kennen, kann man da nicht mehr sagen. Denk' dran, dass der Schlüssel _exakt_ identisch sein muss und Python Groß-/Kleinschreibung unterscheidet. Also ist z.B. `Mustermann@example.com` für Python nicht das gleiche wie `mustermann@example.com` - auch, wenn E-Mail Server beide Adressen an den selben Empfänger zustellen würden.

Gruß, noisefloor

Re: Spezifische Reihe durch append einfügen

Verfasst: Donnerstag 18. November 2021, 10:57
von _corn_
Vielen lieben Dank an alle Antworten!! Die haben mir extrem weiter geholfen. Dafür liebe ich das Forum hier <3. Und @Sirius3: du hast absolut recht, hätte kein neuer Thread sein müssen, sorry nochmal dafür.