Seite 1 von 1
CSV in ein Array einlesen
Verfasst: Freitag 12. Februar 2010, 09:51
von sm00ve
Hallo liebe Python-Gemeinde,
ich möchte aus einer CSV-Datei ein Array machen. Das klappt auch schon halbwegs, allerdings gibt er mir die Elemente in Hochkommas aus.
Hier der Code erstmal.
Code: Alles auswählen
import csv
portfolio = csv.reader(open("time.csv", "rb"),delimiter=',')
portfolio_list = []
portfolio_list.extend(portfolio)
names = []
for data in portfolio_list:
names.append(data[0])
print names
dateiname = "t_meas.dat"
try:
datei = open(dateiname, 'w')
datei.writelines(str(names))
datei.close()
except IOError:
print dateiname, "ist nicht schreibbar"
Um die Hochkommas wegzubekommen, dachte ich, dass die Methode:
string.replace(str, old, new)
vllt ganz gut wäre.
Das klappt aber irgendwie nicht, es scheitert schon daran, dass er replace nicht kennt.
Kann mir da jemand weiterhelfen

?
Beste Grüße
sm00ve
[/code]
Verfasst: Freitag 12. Februar 2010, 10:01
von EyDu
Hallo und willkommen im Forum!
Hast du das Tutiral schon durchgearbeitet? Dann wirst du nämlich darauf stoßen, dass die Ausgabe korrekt ist. Die Hochkommas sind nicht an den Elementen mitgespeichert, sondern dienen nur der Darstellung, damit man zum Beispiel Strings von Integern unterscheiden kann. Eine Liste ist nicht dafür gedacht, einfach an den Benutzer ausgegeben zu werden. Wende mal ein print auf die einzelnen Elemente an.
Da sind noch einige kleinere unschöne Dinge in deinem Programm, aber ich bin zeitlich gerade etwas kurz angebunden. Da findet sich bestimmt noch jemand, der etwas dazu schreibt.
Sebastian
Verfasst: Montag 22. Februar 2010, 10:13
von sm00ve
Die Liste mit Strings muss ich irgendwie in eine Liste mit Integern umwandeln. Kann mir da jemand helfen

Verfasst: Montag 22. Februar 2010, 10:21
von Pekh
sm00ve hat geschrieben:Die Liste mit Strings muss ich irgendwie in eine Liste mit Integern umwandeln. Kann mir da jemand helfen

Wo liegt denn da genau dein Problem? Listen durchlaufen und manipulieren solltest du können, oder?
Verfasst: Montag 22. Februar 2010, 10:37
von sm00ve
So irgendwie durchlaufen?
Ich weiß nicht, wie ich die Elemente in int umwandeln kann.
So in etwa?
Verfasst: Montag 22. Februar 2010, 10:42
von Pekh
Warum probierst du es denn nicht einfach aus? Stattdessen wartest du auf Antworten in einem Forum. Python hat diesen großartigen interaktiven Modus, mit dem man genau solche Sachen blitzschnell testen kann.
Und um deine Frage zu beantworten: Du bist fast da, aber ein kleiner letzter Schritt fehlt noch.
Verfasst: Montag 22. Februar 2010, 12:11
von ms4py
Vielleicht solltest du noch beachten, dass man Elemente einer Liste auch direkt in einer Schleife durchlaufen kann, ohne einen Index einzusetzen:
Und dann gibt es da noch im Tutorial einen schönen Absatz über ListComprehensions, damit kommt man auf eine sehr elegante Lösung, die genau eine Zeile benötigt

Verfasst: Montag 22. Februar 2010, 12:23
von Pekh
ice2k3 hat geschrieben:Vielleicht solltest du noch beachten, dass man Elemente einer Liste auch direkt in einer Schleife durchlaufen kann, ohne einen Index einzusetzen:
Wenn er die Liste aber in-place manipulieren will, nutzt ihm das mit dem direkten Iterieren nicht so viel.
Verfasst: Montag 22. Februar 2010, 12:39
von Zap
Pekh hat geschrieben:Wenn er die Liste aber in-place manipulieren will, nutzt ihm das mit dem direkten Iterieren nicht so viel.
Von daher würd ich vorschlagen die Werte in einer neuen Liste zu speichern.
Code: Alles auswählen
numbers = []
for value in names:
numbers.append(x) # x -> value als Zahl
print numbers
Wenn einem das irgendwann zu lästig ist, kann man sich ja über den Begriff "list comprehension" informieren.
Verfasst: Montag 22. Februar 2010, 13:23
von sm00ve
Danke für eure Hilfe
Code: Alles auswählen
import csv
portfolio = csv.reader(open("time.csv", "rb"),delimiter=',')
portfolio_list = []
portfolio_list.extend(portfolio)
names = []
for data in portfolio_list:
names.append(data[0])
newlist=[]
for i in range(len(names)):
t = float(names[i])
newlist.append(t)
print t
print newlist
Ich glaube ich habs

Verfasst: Montag 22. Februar 2010, 13:45
von /me
sm00ve hat geschrieben:Danke für eure Hilfe
Code: Alles auswählen
[...]
newlist=[]
for i in range(len(names)):
t = float(names[i])
newlist.append(t)
Das kann man so machen, allerdings ist das arg umwegig. Arbeite das Tutorial durch und lerne pythonisch zu denken. Du führst hier eine Variable i ein und ermittelst die Größe des Arrays um damit der Reihe nach auf die einzelnen Elemente zugreifen zu können. Das geht, wie ice2k3 bereits geschrieben (und du anscheinend leider überlesen) hat, deutlich schöner:
Code: Alles auswählen
newlist = []
for value in names:
t = float(value)
newlist.append(t)
Jetzt nehmen wir noch die überflüssige Hilfsvariable raus:
Code: Alles auswählen
newlist = []
for value in names:
newlist.append(float(value))
Damit bist du jetzt quasi schon bei der
List-Comprehension die dann so aussieht:
Schöner, schneller, eleganter!
Re: CSV in ein Array einlesen
Verfasst: Donnerstag 27. Mai 2010, 13:44
von Pretender2k
Hallo zusammen,
der Thread ist zwar scho etwas aelter, aber da sich meine Frage direkt auf das Gleich Problem bezieht bin ich hier vielleicht trotzdem richtig.
Ich wuerde auch gerne ein csv datei in python einlesen, funktioniert aber nicht wirklich

. Meine csv datei schaut folgendermassen aus:
1. Zeile: Variablen_name1; Variablen_name2; Variablen_name3;
2. Zeile: 2010-01-27 01:01:35; 2222; 12412
3. Zeile....
Unter Vaiablen_name1 steht also ein Datum und die Uhrzeit. Ich wuerde gerne als Ergebniss im Python gerne ein Array haben das folgenden Inhalt hat:
1.Spalte
Zeit in s (von 0 Uhr ausgerechnet) z.b 3695 (1*60*60+60+35)
2. Spalte
Wert von Variablen_name2 z.B. 2222
3. Spalte
Wert von Variablen_name3 z.B. 12412
Mein Plan war jetzt folgender:
- CSV Datei mit python einlesen
Liste Lneu aus den CSV Daten erstellen
Erste Zeile der Liste Lneu loeschen
Erste Spalte der Liste Lneu in einer neuen Liste Ldatum speichern
Lneu in ArrayLneu umwandeln
Irgnedwie aus Ldatum die Sekundenzahl ermitteln und in einem array ArraySec abspeichern
Finale Matrix herstellen aus ArraySec und ArrayLneu
So jetzt zu meinem Programmcode
Code: Alles auswählen
from pylab import *
import csv
blub = open("test1.csv", "rb")
reader = csv.reader(blub, delimiter = ';')
Lneu = []
Lneu.extend(reader)
Lneu = Lneu[1:]
Ldatum = Lneu[:][0] <--- funktioniert nicht
Lneu = Lneu[1:][:] <--- funktioniert nicht
Jau leider klappts so nicht. Grund ist, dass der Aufbau der Liste schon falsch ist. Das schaut so fuer mich nach liste(liste1; liste2; liste3) aus. Soll aber nur eine liste sein und nicht irgendwie komisch verworren. Hat jemand nen Vorschlag wie man das richtig macht? (reshape hat bisher nicht funktioniert)
Re: CSV in ein Array einlesen
Verfasst: Donnerstag 27. Mai 2010, 14:25
von BlackJack
@Pretender2k: Ich bin verwirrt. Laut der Beschreibung was Du in welcher Spalte haben willst, ist das doch exakt das was in der CSV-Datei steht, nur ohne Header und die erste Spalte entsprechend in eine Zahl umgesetzt!?
Die erste Zeile würde ich beim einlesen schon entfernen. Einfach einmal am Anfang die `next()`-Methode auf dem "reader" aufrufen und das Ergebnis ignorieren.
Ich würde die Daten nicht auf mehrere Listen aufteilen -- hier solltest Du übrigens die Begriffe Liste und Array etwas besser auseinanderhalten. Einfach Zeilenweise einlesen und die nötigen Umwandlungen auf den einzelnen Werten durchführen und das dann in eine verschachtelte Liste speichern. Für die Datumsgeschichte gibt's das Modul `datetime`. Ein `timedelta`-Objekt sollte die Sekunden sogar schon passend als Attribut bereithalten.
Falls es am Ende tatsächlich ein Array von `numpy` werden soll, kann man das ganz einfach aus der "2D-Liste" erstellen. Und dann erst Zeilen und Spalten vertauschen falls das nötig ist. Dafür haben `numpy`-Arrays nämlich eine Methode.
Re: CSV in ein Array einlesen
Verfasst: Donnerstag 27. Mai 2010, 14:49
von Pretender2k
Da ich noch nicht wirklich richtig im python programmieren drin bin kurz etwas Wiederholung fuer mich.
Code: Alles auswählen
In [53]: tupel = (1,2,3,4,5)
In [54]: type(tupel)
Out[54]: <type 'tuple'>
In [55]: liste = [1,2,3,4,5]
In [56]: type(liste)
Out[56]: <type 'list'>
In [57]: numpyarray = array([1,2,3,4,5])
In [58]: type(numpyarray)
Out[58]: <type 'numpy.ndarray'>
Die Sachen interessieren mich gerade besonders. Als Eingang erhalte ich von meinem Einlese Algorithmus eine Liste. Da ich meine Daten aber nicht als Liste haben will sondern als Array muss ich die Liste in ein Array umwandeln. Also zum Beispiel so:
In [59]: ArrayAusListe = array(liste)
In [60]: type(ArrayAusListe)
Out[60]: <type 'numpy.ndarray'>
Jetzt zum eigentlichen Problem wieder

Ich bekomme einfach aus meiner CSV Datei keine vernuenftige Liste hin. Wenn ich allles Eingelesen hab sollte ich eine Liste haben die zum Beispiel 10 Zeilen und 3 Spalten. Versteh ich da vielleicht was mit den Listen falsch?
P.S.: Schaus mir jetzt nochmal genauer and, mein problem ist wohl nicht ganz zu verstehen

Re: CSV in ein Array einlesen
Verfasst: Donnerstag 27. Mai 2010, 15:02
von BlackJack
@Pretender2k: Eine Liste ist was eindimensionales, Du kannst also keine Liste mit Zeilen und Spalten haben. Man kann in eine Liste aber beliebige Objekte stecken, also zum Beispiel auch Listen. Dein Beispiel wäre dann eine Liste die 10 Listen enthält, welche jeweils drei Zahlen enthalten. Eine Funktion zum Einlesen könnte also ungefähr so aussehen (ungetestet):
Code: Alles auswählen
def read_csv(filename):
result = list()
with open(filename, 'rb') as csv_file:
reader = csv.reader(csv_file, delimiter=';')
reader.next() # Skip header row.
for date, value_a, value_b in reader:
result.append([date2seconds(date), int(value_a), int(value_b)])
return result
Die Kopfzeile wird übersprungen und dann werden die Zeilen eingelesen und als Liste mit den umgewandelten Werten an die Ergebnisliste angehängt.
Re: CSV in ein Array einlesen
Verfasst: Freitag 28. Mai 2010, 13:20
von Pretender2k
okili es lauft alles jetzt! danke!
P.S.: Die Sache mit dem Datum hab ich selbst geloest