Seite 1 von 1

CSV, List, Dictionarie und Loops

Verfasst: Dienstag 29. Mai 2018, 21:47
von DrRocket
Hallo zuammen,

ich lerne seit knapp 3 Wochen Python in meiner Freizeit und habe Probleme mit einer Übungsaufgabe. Es geht um folgendes:

- csv Datei öffnen und Zeile für Zeile auslesen
- Bestimmte Elemente (key, value) jeder Zeile in einem Dictionarie ablegen
- Wenn es im dict bereits einen Eintrag mit key == "Name" gibt, dann soll der value zu diesem Eintrag um den aktuell ausgelsenen value der csv Datei erhöht werden

Hier der Code:

Code: Alles auswählen

with open("data/list_dict_beispiel.csv", "r") as file:
    splitted_list = []
    result_dict = {"": 0}
    name = 0
    count = 0

    for line in file:
        splitted_list = line.strip().split(",")
        name = splitted_list[1]
        count = int(splitted_list[5])
        for key, value in result_dict.items():
            if key == name:
                result_dict[key] = result_dict[key] + value
            else:
                result_dict[key] = value
print(result_dict)
Die erste for Schleife wird richtig durchlaufen und auch die richtigen Werte, Typen werden in den Variablen name und count abgelegt. Die zweite for Schleife scheint allerdings nicht durchzulaufen. Das dict bleibt leer. Jemand eine Idee was ich hier übersehen habe?

Der Inhalt der csv Datei sieht wie folgt aus:

5647376,Caden,2014,M,WY,2
5647377,Camden,2014,M,WY,6
5647378,Cayden,2014,M,WY,6
5647379,Christian,2014,M,WY,6

Re: CSV, List, Dictionarie und Loops

Verfasst: Dienstag 29. Mai 2018, 22:19
von DrRocket
Habe den Fehler gerade selbst gefunden. Die zweite for Schleife ist falsch. Der Code müsste so aussehen falls es wen interessiert:

Code: Alles auswählen

with open("data/list_dict_beispiel.csv", "r") as file:
    result_dict = {}
    splitted_list = []

    for line in file:
        splitted_list = line.strip().split(",")
        if splitted_list[1] == "Id":
            continue
        name = splitted_list[1]
        count = int(splitted_list[5])
        print(name + " " + str(count))
        if name in result_dict:
            result_dict[name] = result_dict[name] + count
        else:
            result_dict[name] = count
print(result_dict)

Re: CSV, List, Dictionarie und Loops

Verfasst: Mittwoch 30. Mai 2018, 07:13
von Sirius3
Für das Lesen von csv-Dateien gibt es das Modul csv. Das solltest Du benutzen und nicht etwas eigenes erfinden. Du weist `splitted_list` eine leere Liste zu, die Du gar nicht verwendest, die Zeile kann weg. Wenn es eine Header-Zeile (bei Dir durch "ID" gekennzeichnet), entfernt man die, bevor man in die for-Schleife geht. Strings stückelt man nicht mit + und str zusammen, sondern benutzt .format. Statt sich selbst einen Mechanismus auszudenken, wie man in einem Wörterbuch zusammenzählen kann, nimmt man defaultdict.

Code: Alles auswählen

import csv
from collections import defaultdict

with open("data/list_dict_beispiel.csv", "r") as lines:
    entries = csv.reader(lines)
    _header = next(entries)
    result_dict = defaultdict(int)
    for entry in entries:
        name = entry[1]
        count = int(entry[5])
        print("{} {}".format(name, count))
        result_dict[name] += count
print(result_dict)

Re: CSV, List, Dictionarie und Loops

Verfasst: Mittwoch 30. Mai 2018, 14:00
von ThomasL
Sirius3 hat geschrieben: Mittwoch 30. Mai 2018, 07:13 Strings stückelt man nicht mit + und str zusammen, sondern benutzt .format.

Code: Alles auswählen

        print("{} {}".format(name, count))
und da du ganz frisch dabei, noch lernfähig bist und ein richtiger Pythonista werden willst,
empfehle ich dir die f-strings die es seit Python 3.6 gibt. :shock:

Code: Alles auswählen

        print(f"{name} {count}")