CSV-Datei ein Python einlesen

vom 18.05.2011, 20:29 Uhr

Ich beschäftige mich derzeit gerade etwas mit der Programmierung in Python. Viel Erfahrung konnte ich damit zwar noch nicht sammeln, aber in vielen Bereichen ähnelt die Sprache auch anderen, etwas gängigeren Sprachen, sodass ich relativ gut damit klar komme. Nun ist es so, dass ich eine CSV-Datei in Python einlesen möchte und mit den darin enthaltenen Daten anschließend weiter arbeiten möchte.

In meiner CSV-Datei liegen Datensätze, die jeweils aus ein paar Werten bestehen, die durch ein Komma getrennt sind. Das Einlesen beziehungsweise dann wieder das Ausgeben habe ich durch Python auch ohne Probleme hinbekommen. Jedoch möchte ich die Daten in Python mehr oder weniger speichern und dann für andere Module verwenden können. Gleichzeitig ist es so, dass ich die einzelnen Werte eines Datensatzes benötige um damit eine Funktion aufzurufen.

Ich habe jetzt zwar schon online nach solchen Möglichkeiten gesucht, aber leider habe ich noch nicht so richtig gefunden was ich suche. Hat jemand eine Idee wie man in Python also nicht nur die ganze CSV-Datei einlesen kann, sondern auch einzelne Werte eines Datensatzes zunächst ausgelesen, damit eine Funktion aufgerufen und anschließend dann der nächste Datensatz, mit den nächsten einzelnen Werte aufgerufen werden kann?

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge



BrilleWilli hat geschrieben:Jedoch möchte ich die Daten in Python mehr oder weniger speichern und dann für andere Module verwenden können.

Du kannst keine Daten in einem Script bzw. Programm speichern. Das geschieht in Dateien bzw. Datenbanken. Ich hab keine Ahnung, was du damit meinst oder meinst du die Daten in einer Liste "ablegen"?
BrilleWilli hat geschrieben:Gleichzeitig ist es so, dass ich die einzelnen Werte eines Datensatzes benötige um damit eine Funktion aufzurufen.

Dazu kannst du entweder die gesamte CSV-Datei in eine Liste einlesen oder aber du ließt nur eine Zeile aus (also bei CSV entspräche das ja einem Datensatz). Will man beispielsweise den 10 Datensatz auslesen kann man es so umsetzen:

Code: Alles auswählen
import linecache
filePath = "input.csv"
line = linecache.getline(filePath, 10)
data = line.split(",")

Auf die einzelnen Spalten kann man nun mittels "data[0]", "data[1]", und so weiter zugreifen. Ich hoffe das war das was du suchst, ansonsten würde ich dich bitten das Ganze etwas verständlicher auszudrücken.

Benutzeravatar

» Smoon » Beiträge: 440 » Talkpoints: 2,83 » Auszeichnung für 100 Beiträge


Danke schon einmal für deine Hilfe. Ich habe mir schon gedacht, dass ich wohl etwas präziser sein muss, damit mir wirklich geholfen werden kann. Mein Problem ist also, dass ich eine CSV-Datei vorliegen habe. Diese möchte ich nun in Python einlesen. Das Einlesen an sich stellt auch noch kein Problem dar. Allerdings möchte ich das Dokument in einer bestimmten Art einlesen damit ich mit den darin vorhandenen Daten weiter arbeiten kann. Das Ganz soll dann so ablaufen, dass ich zunächst eine Zeile einlese. Die einzelnen Daten in dieser Zeile müssten dann wiederum in Variablen geschrieben werden und damit dann eine andere Methode aufgerufen werden. Anschließend sollte das gleiche Verfahren auf alle anderen Zeilen des Dokumentes angewendet werden bis alle Zeilen abgearbeitet sind.

Das Problem besteht dann in erster Linie darin, dass ich die einzelnen Zeilen zu "greifen" bekomme und dann die einzelnen Werte dieser Zeile erfassen kann. Mit der ganzen Zeile an sich kann ich nämlich leider nicht viel anfangen, da die Struktur meines restlichen Programms darauf ausgerichtet ist, dass alle Werte, wie zum Beispiel der Vorname und der Nachname einzeln erfasst werden müssen, sodass dann die entfernte Methode benutzt werden kann.

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge



Ich denke nun hab ich verstanden was du meinst. Ich hab mal schnell ein Script geschrieben, wo ich alles kommentiert habe.

Code: Alles auswählen
# CSV Datei oeffnen
file = open("test.csv")

# Gesamte Datei einlesen
content = file.read()

# Datei schliessen
file.close()

# Liste mit den einzelnen Datensaetzen erstellen
dataset = content.split("\n")

# Datensaetze durchlaufen
for data in dataset:
   # Einzelne Spalten extrahieren
   col = data.split(";")
   
   # Daten aus den Spalten an Variablen uebergeben
   if len(col) == 3:
      name = col[0]
      lastname = col[1]
      city = col[2]
      
      # Daten an Funktion uebergeben
      dosomething(name, lastname, city)


Die Trennzeichen musst du evtl. anpassen, da ich nicht genau weiß wie deine CSV-Datei aufgebaut ist. Sollte noch was unklar sein einfach Fragen ;)

Benutzeravatar

» Smoon » Beiträge: 440 » Talkpoints: 2,83 » Auszeichnung für 100 Beiträge



Danke nochmals für deine Hilfe. Ich habe den Code einmal ausprobiert aber irgendetwas scheine ich immer noch falsch zu machen. Ich habe die Datei jetzt erfolgreich einlesen können. Zum Testen habe ich am Ende der If-Schleife eine Ausgabe gesetzt um mir dann dort die einzelnen Werte ausgeben zu lassen. Aber leider hat dies dann nicht funktioniert und ich habe keine Ausgabe bekommen. Ich weiß jetzt nicht woran es liegen kann, denn wenn ich den Code richtig verstehe, dann wird doch vorher jede Zeile ausgelesen und eben alle Werte dieser Spalte in die Variablen Name, Lastname und City geschrieben. Allerdings führt eben diese Ausgabe zu keinem Ergebnis. Hast du eine Idee woran dies liegen kann?

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge


Zu erst einmal "if" ist keine Schleife sondern eine Verzweigung. Schleifen währen beispielsweise "while" oder "for".

Ich weiß jetzt nicht woran es liegen kann, denn wenn ich den Code richtig verstehe, dann wird doch vorher jede Zeile ausgelesen und eben alle Werte dieser Spalte in die Variablen Name, Lastname und City geschrieben


Zu Beginn werden alle Daten ausgelesen und anschließend die einzelnen Zeilen extrahiert (jede Zeile stellt ja einen Datensatz dar). Die Liste mit den Datensätzen wird dann durchlaufen und die einzelnen Spalten des aktuellen Datensatzes ausgelesen (jede Spalte enthält die entsprechenden Daten, beispielsweise Name, Nachname, etc.)

Allerdings führt eben diese Ausgabe zu keinem Ergebnis. Hast du eine Idee woran dies liegen kann?


Wie schon gesagt musst du eventuell die Trennzeichen anpassen oder die "If"-Abfrage an die Anzahl der Spalten anpassen. Zum testen hatte ich nur eine CSV-Datei mit drei Spalten erstellt. Wenn bei dir mehr sind musst du die Zahl natürlich entsprechend anpassen.

Hilfreich wäre eventuell auch zu wissen wie deine CSV-Datei aufgebaut ist.

Benutzeravatar

» Smoon » Beiträge: 440 » Talkpoints: 2,83 » Auszeichnung für 100 Beiträge


Smoon hat geschrieben:Zu erst einmal "if" ist keine Schleife sondern eine Verzweigung. Schleifen währen beispielsweise "while" oder "for".


Es war mir schon klar als ich es geschrieben hatte, dass ich dafür korrigiert werde. Ich weiß, dass es sich bei einem If um eine Anweisung und um eine richtige Schleife handelt.

Mittlerweile habe ich ein wenig versucht das ganze auf mein Problem anzupassen und habe auch hier und da kleine Fortschritte gemacht. Ich habe jetzt derzeit nur noch ein letztes Problem, an dem ich nicht weiter komme. Ich muss mir jetzt eine for-Schleife bauen, die alle Datensätze einliest. Darin möchte ich dann die einzelnen Werte auslesen, speichern und damit die andere Methode aufrufen. Das innere Vorgehen habe ich mittlerweile schon. Ich weiß jetzt nur nicht genau wie ich dem Programm sage, dass er Zeile für Zeile durch die Datensätze gehen und eben dann aufhören soll, wenn es keine weiteren Zeilen beziehungsweise Datensätze mehr gibt.

Gibt es hierfür auch eine Möglichkeit oder muss ich das manuell einstellen und auf die Anzahl der vorhandenen Datensätze manuell umstellen? Im Prinzip müsste doch einfach der Linepath "hochzählen" und dann bemerken, dass eben keine weiteren Informationen gespeichert sind, sodass er abbrechen kann.

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge



Dann schau dir mein Beispiel-Programm noch einmal genau an. Das aufsplitten in einzelne Zeilen (Datensätze) geschieht mittels "dataset = content.split("\n") ". Die nach folgende For-Schleife durchläuft anschließend alle Zeilen, bis keine mehr vorhanden ist. Eventuell solltest du dir das Konstrukt der Liste in Python mal anschauen.

Benutzeravatar

» Smoon » Beiträge: 440 » Talkpoints: 2,83 » Auszeichnung für 100 Beiträge


Danke nochmals für deine Hilfe. Ich habe gestern noch eine Weile mit den verschiedenen Möglichkeiten herumgespielt und habe dann letzten Endes eine Möglichkeit gefunden, die meinen Wunsch so umsetzt wie ich es benötige. Es ist zwar am Ende nicht die sauberste und einfachste Form der Programmierung geworden, aber immerhin läuft es jetzt so wie ich es mir vorgestellt habe.

» BrilleWilli » Beiträge: 1810 » Talkpoints: 14,07 » Auszeichnung für 1000 Beiträge


Ähnliche Themen

Weitere interessante Themen

^