Python csv in Dict + Spalte berechnen Neuling braucht Hilfe

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
Barry2018
User
Beiträge: 2
Registriert: Sonntag 7. Januar 2018, 15:48

Hallo zusammen,

ich absolviere aktuell einen Python Grundkurs und komme leider bei meiner Aufgabe nicht weiter.
Vielleicht kann mir ja hier jemand helfen. Ich möchte wirklich gern verstehen was ich falsch mache.

Aufgabe:

1. CSV Datei in ein Dictionary einlesen

(Diese schaut circa so aus:

1. Zeile (Header) : Id,Name,Year,Gender,State,Count
2. Zeile: 1,Mary,1910,F,AK,14
3. - X Zeile: Selbiger Aufbau wie Zeile 2

2. Analysiere dein Dict und finde heraus, welcher der häufigste Vorname ist
(3. Schreibe den gesamten Code, der die Zeile öffnet und durchgeht in einer Zeil) <- Habe ich mich jetzt erstmal nicht drauf konzentriert.


Was ich bisher habe ist folgendes:

ANSATZ 1:

import linecache
filepatch = "kursmaterialien/data/names.csv"
line = linecache.getline(filepatch, 2
)
data = line.split(",")

liste = (data)
d = {}

for element in liste:
if element in d:
d[element] = [element] + 1
else:
d[element] = 1
print(d)


Hier wäre die Ausgabe die jeweilige Zeile:
Also in dem Falle:

{'1': 1, 'Mary': 1, '1910': 1, 'F': 1, 'AK': 1, '14\n': 1}


ANSATZ 2

import linecache
filepatch = "kursmaterialien/data/names.csv"
d = {}
liste = (data)




line_splitted = line.strip().split(",")
for element in liste:
if line_splitted[2] and element in d:
d[element] = [element] + 1
else:
d[element] = 1

print(d)

Hier wäre die Ausgabe schon eher das was ich möchte:
{'Id': 1, 'Name': 1, 'Year': 1, 'Gender': 1, 'State': 1, 'Count\n': 1}


Allerdings ist es auch nur annähernd das was ich brauche.

Was ich ja eigentlich möchte, ist das wir uns Spalte "Name" anschauen und dann entsprechend die Namen + Anzahl auswerfen.


Kann jemand helfen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ach du liebe Güte, woher kommt denn die Renaissance des linecache Moduls? Du bist schon der zweite, der das in 24h anbringt...

Nimm stattdessen das csv Modul, und da bevorzugt den DictReader. Damit bekommst du die Liste deiner Zeilen als jeweils ein Dictionary pro Zeile. Und dann baust du eine einfache Schleife, welche die Namen daraus holt und in ein Ergebnis dict steckt. Am besten ein Collection.defaultdict(int), dann wird das Histogramm bauen besonders einfach.
Barry2018
User
Beiträge: 2
Registriert: Sonntag 7. Januar 2018, 15:48

Das hilft mir jetzt leider nicht weiter.

Besteht denn nicht die Möglichkeit mit dem vorhandenen auf alle Zeilen zuzugreifen?

Aktuell kann ich die gewünschte Frage für eine ausgewählte Zeile auswerfen.
Gibt es nicht die Möglichkeit dies Zeile für Zeile durchlaufen zu lassen?

import linecache
filepatch = "kursmaterialien/data/names.csv"

line = linecache.getline(filepatch, 10000)
data = line.split(",")


liste = (data)
d = {}

for element in liste:
if element in d:
d[element] = [element] + 1
else:
d[element] = 1
print(d)


print(line)

häufigster_name = 0

for key, value in d.items():
if häufigster_name < value:
häufigster_name = value

print(häufigster_name)


AUSGABE:

{'9999': 1, 'Kylie': 1, '1997': 1, 'F': 1, 'AK': 1, '13\n': 1}
9999,Kylie,1997,F,AK,13

1
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte poste mit Code Tags. Und ehrlich gesagt: auch wenn es als Anfänger when tut, wenn du lernen willst zu programmieren, lern deinen Code wegzuwerfen wenn nötig. Das tue ich nach 30 Jahren auch noch. Und es ist nötig.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Barry2018: »linecache« ist einfach das falsche Modul. Keine Ahnung woher Du das hast. Beim Programmieren kommt es halt auch darauf an, das anzuwenden, was es schon fertig gibt, und »csv.DictReader« liest die Datei schon genau in das Format, das Du zum weiterverarbeiten brauchst.
Um Wörter zu zählen, gibt es dann collections.Counter, das dann auch gleich die häufigsten Wörter ermitteln kann. Benutzt man diese Module, ist Dein Problem in 4 Zeilen gelöst.

Zu Deinem letzten Code: der läuft nicht, weil man zu einer Liste nicht 1 addieren kann. Ich seh auch nicht, wo Du jede Zeile in ein Wörterbücher packst, wo Du den Namen ermittelst und wie Du mit der letzten for-Schleife den Schlüssel finden willst. Eingerückt wird überigens immer mit 4 Leerzeichen pro Ebene, nicht 8 oder Tab.
Antworten