CSV-Datei einlesen und bearbeiten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Isa
User
Beiträge: 3
Registriert: Montag 17. April 2017, 15:51

Hallo zusammen,

ich bin leider blutige Anfängerin im Programmieren und muss jetzt für die Uni eine (in meinen Augen) sehr schwierige Aufgabe lösen. Ich hoffe, dass mir hier jemand helfen kann, da ich einfach nicht mehr weiter komme.
Es geht darum:
Ich habe eine CSV-Datei mit vielen statistischen Daten und muss dazu ein Programm schreiben, das diese Daten einliest und alle Angaben in eine geeignete Datenstruktur überträgt (keine Liste). Im Anschluss daran muss ich bestimmte Daten aus der Datei rausfiltern und wieder als CSV abspeichern.
Leider scheitere ich schon am ersten Punkt: "in einer geeigneten Datenstruktur darstellen"...
Bisher habe ich meine CSV Datei in Python geöffnet:

Code: Alles auswählen

import csv

file = open("bka1.csv", "r")
csv_reader = csv.reader(file, delimiter=",")
for row in csv_reader:
   print(row)
file.close()
Über die geeignete Datenstruktur habe ich mir auch schon paar Gedanken gemacht. Vielleicht kann man das mit Dictionarys umsetzten?

Ich hoffe, dass ich hier einige neue Ideen und Ansätze finde. Vielen Dank schonmal für alle Antworten (bitte seid nachsichtig, ich bin wirklich blutige Anfängerin :) )
LG Isa
Zuletzt geändert von Anonymous am Montag 17. April 2017, 23:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hi Isa und willkommen im Forum. :)
Isa hat geschrieben:Über die geeignete Datenstruktur habe ich mir auch schon paar Gedanken gemacht. Vielleicht kann man das mit Dictionarys umsetzten?
Ein Dictionary ist eine gute Idee. Die verschiedenen Kategorien sind die Schlüssel des Dictionaries und die Werte kann man ja als Liste abbilden.

Schau dir hierfür mal den DictReader an. Der unterstützt dich dabei, indem er die einzelnen Zeilen jeweils als Dictionary liefert. Die Bezeichnungen für die Kategorien gibst du ihm mit dem Parameter fieldnames an.

Wenn du das geschafft hast, dann musst du dir nur noch überlegen, wie du die einzelnen "Zeilen-Dicts" zu einem gesamten Dict verbindest.
Isa hat geschrieben:(bitte seid nachsichtig, ich bin wirklich blutige Anfängerin :) )
Für Anfängercode war das schon ganz okay. ;)
Zuletzt geändert von snafu am Montag 17. April 2017, 17:10, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Geeignete Datenstruktur ist kein generischer Begriff, aus dem sich dann ableiten laesst, was das richtige ist. Sondern es muss geeignet fuer einen gegebenen Zweck sein. "Keine Liste" ist da als Beschreibung etwas wenig, und vor allem auch fragwuerdig. Gerade bei statistischen Daten bin ich mir sehr sicher, dass da irgendwo Listen vorkommen, denn man hat ja ueblicherweise Reihen von Daten, auf denen man dann rumfuhrwerkt.

Insofern wirst du uns schon etwas mehr verraten ueber deine Daten, und was mit denen geschehen muss.
Isa
User
Beiträge: 3
Registriert: Montag 17. April 2017, 15:51

snafu hat geschrieben:
Schau dir hierfür mal den DictReader an. Der unterstützt dich dabei, indem er die einzelnen Zeilen jeweils als Dictionary liefert. Die Bezeichnungen für die Kategorien gibst du ihm mit dem Parameter fieldnames an.
Vielen Dank für deine schnelle Antwort. Über den DictReader habe ich schonmal was gelesen. Meine Frage: Kann der sich die einzelnen Zeilen aus der zuvor geöffneten CSV-Datei selbst "rausziehen"? Die Datei hat nämlich ziemlich viele Zeilen....
Ich hoffe man versteht was ich meine :wink:
LG Isa
Isa
User
Beiträge: 3
Registriert: Montag 17. April 2017, 15:51

__deets__ hat geschrieben:Geeignete Datenstruktur ist kein generischer Begriff, aus dem sich dann ableiten laesst, was das richtige ist. Sondern es muss geeignet fuer einen gegebenen Zweck sein. "Keine Liste" ist da als Beschreibung etwas wenig, und vor allem auch fragwuerdig. Gerade bei statistischen Daten bin ich mir sehr sicher, dass da irgendwo Listen vorkommen, denn man hat ja ueblicherweise Reihen von Daten, auf denen man dann rumfuhrwerkt.

Insofern wirst du uns schon etwas mehr verraten ueber deine Daten, und was mit denen geschehen muss.
Danke für deine Antwort. Leider ist wohl die Aufgabenstellung allgemein sehr vage gestellt. Hier der genaue Wortlaut:
"Schreiben Sie ein Programm, dass diese Datei einliest und alle Angaben in eine gut geeignete Datenstruktur überträgt (Hinweis: eine Liste könnte dafür nicht der richtige Ansatz sein). Im Anschluss soll Ihr Programm die folgenden Auswertungen durchführen und die Ergebnisse wieder als CSV-Dateien speichern."
Deshalb in meinem ersten Text der Hinweis, dass es keine Liste sein sollte...
Bei den Daten handelt es sich um Statistiken zur Kriminalität, die das Bundeskriminalamt jedem online zur Verfügung stellt.

Ich hoffe das hilft mehr...
Danke schonmal LG Isa
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Isa hat geschrieben:Kann der sich die einzelnen Zeilen aus der zuvor geöffneten CSV-Datei selbst "rausziehen"?
Leider nicht. Das musst du selbst mit Code erledigen, der wie dein Beispiel die Zeilen durchgeht und die dann nochmals in ein vorab erstelltes Dictionary ablegt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Isa hat geschrieben:"Schreiben Sie ein Programm, dass diese Datei einliest und alle Angaben in eine gut geeignete Datenstruktur überträgt (Hinweis: eine Liste könnte dafür nicht der richtige Ansatz sein). Im Anschluss soll Ihr Programm die folgenden Auswertungen durchführen und die Ergebnisse wieder als CSV-Dateien speichern."
Mit dem Hinweis ist wahrscheinlich nur gemeint, dass man die Zeilen nicht in eine riesige Liste klatschen soll, sondern dass man sie sinnvoll strukturiert bevor die Analyse erfolgt. Ein Verbot von Listen als Unterstrukturen (eben für die einzelnen Werte) lese ich da nicht raus.

EDIT: Im Zweifel dem Prof ne Mail schicken oder du fragst deine Kommis. ;)
Zuletzt geändert von snafu am Montag 17. April 2017, 17:43, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Isa na, du stoppst genau an der Stelle, wo es interessant wird: bei der Beschreibung dessen, *was* denn nun genau passieren soll mit den Daten.

Und auch die Datenquelle ist fuer eine Beurteilung nicht vernuenftig angegeben. Ich bin zwar recht sicher, dass ich nach einiger Sucherei irgendwelche Daten vom BKA runterladen kann, aber ob das nun die richtigen sind, weiss ich nicht. Es waere also eher angebracht, uns hier einen Ausschnitt zB der ersten 10 Zeilen oder so zu posten, damit man zusammen mit der gewuenschten Analyse eine Idee entwickeln kann, wie die Datenstruktur aussehen soll.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@__deets__:
Aber an dem Punkt ist sie doch noch gar nicht...
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@snafu: an welchem Punkt? Uns zu sagen, wie die Daten aussehen? Und ich interpretiere "Im Anschluss soll Ihr Programm die folgenden Auswertungen durchführen" als Zeichen, dass da noch was kommt. Das finde ich schon interessant fuer die Frage nach geeigneter Datenstruktur.

Und das es keine Liste sein soll... prinzipiell koennte man statt einem Dict auch eine Liste von Listen, und Konstanten fuer die Zuordnung zu bestimmten Spalten nehmen. Was man vermeiden will ist ja hauptsaechlich Code der Form "daten[12334][389]". Ob nun aber "daten['alter']" oder "daten[ALTER]" da steht...
Apex
User
Beiträge: 8
Registriert: Montag 10. April 2017, 12:50

Hallo, ich bin selber noch ein Pythonneulig. Ich habe z.Zt ein eigenens kleines Projekt in dem ich das zufällig auch mache. Ich habe es folgend gelöst:

Code: Alles auswählen

        
# leere Listen erstellen für spätere Befüllung aus der CSV
        self.lst_abschluss=[]
        self.lst_studiengang_BA=[]
        self.lst_studiengang_MA=[]
        self.lst_modul=[]
        self.lst_module_BA_BauIng=[]
        self.lst_module_BA_UmweltIng=[]
        self.lst_module_BA_WiIng=[]
        self.lst_module_BA_GeoInfo=[]
        self.lst_module_MA_WiIng=[]
        self.lst_module_MA_BauIng=[]
        self.lst_module_MA_GeoInfo=[]
        self.lst_module_MA_UmweltIng=[]
        self.lst_semester=[]
        self.lst_dozent=[]
        self.lst_przr=[]
        self.lst_version=[]
        self.lst_note=[]
        self.total_content=[]

# Einladen der CSV Datei (sie liegt im gleichen Ordner)        
        with open('LOUIS-Beuth-Renamer.csv','r',newline='')as csvfile:
            for row in csv.reader(csvfile):
                    self.total_content.append(row)

# Befüllen der oben angelegten Listen mit den Daten aus der CSV 
# Achtung die CSV Datei beginnt bei Zeile Null (self.total_content[b][0][/b]) und nicht wie normal mit Zeile eins!
        self.lst_abschluss=self.total_content[0]
        self.lst_studiengang_BA=self.total_content[1]
        self.lst_studiengang_MA=self.total_content[2]
        self.lst_module_BA_BauIng=self.total_content[3]
        self.lst_module_BA_UmweltIng=self.total_content[4]
        self.lst_module_BA_WiIng=self.total_content[5]
        self.lst_module_BA_GeoInfo=self.total_content[6]
        self.lst_module_MA_WiIng=self.total_content[7]
        self.lst_module_MA_BauIng=self.total_content[8]
        self.lst_module_MA_GeoInfo=self.total_content[9]
        self.lst_module_MA_UmweltIng=self.total_content[10]
        self.lst_semester=self.total_content[11]
        self.lst_dozent=self.total_content[12]
        self.lst_przr=self.total_content[13]
        self.lst_version=self.total_content[14]
        self.lst_note=self.total_content[15]
        
Ich habe hier im Forum schon viel "ärger" bekommen weil es keine schöne Umsetzung ist aber vielleicht hilft es dir etwas schönes Draus zu machen ^^

Das wichtige ist, ES LÄUFT!!!

Ach ja "import csv" nicht vergessen
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und genau aus solchen Gründen habe ich den DictReader vorgeschlagen, eben damit da kein unleserliches Hauptsache-es-läuft Gedöns rauskommt:

Code: Alles auswählen

from collections import defaultdict
from csv import DictReader

def parse_csv(filename, fieldnames=None, delimiter=','):
    result = defaultdict(list)
    with open(filename) as infile:
        reader = DictReader(
            infile, fieldnames=fieldnames, delimiter=delimiter
        )
        for row in reader:
            for fieldname, value in row.items():
                result[fieldname].append(value)
    return result
Übrigens: Wenn man die fieldnames bei None belässt, dann zieht er sich diese automatisch. Dafür müssen sie in der ersten Zeile der CSV-Datei stehen. Diese Zeile nutzt er dann sozusagen als Quelle.
BlackJack

@Apex: „Es läuft“ reicht nicht, denn die Aufgabenstellung verlangt ja explizit „eine gut geeignete Datenstrukur“ und nicht das man das nur irgendwie in den Speicher bekommt.
Antworten