CSV in ein Array einlesen

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
sm00ve
User
Beiträge: 4
Registriert: Freitag 12. Februar 2010, 09:42

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]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
sm00ve
User
Beiträge: 4
Registriert: Freitag 12. Februar 2010, 09:42

Die Liste mit Strings muss ich irgendwie in eine Liste mit Integern umwandeln. Kann mir da jemand helfen :? :(
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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?
sm00ve
User
Beiträge: 4
Registriert: Freitag 12. Februar 2010, 09:42

Code: Alles auswählen

for i in range(len(names)):
So irgendwie durchlaufen?
Ich weiß nicht, wie ich die Elemente in int umwandeln kann.

Code: Alles auswählen

test= int(names[i])
So in etwa?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Vielleicht solltest du noch beachten, dass man Elemente einer Liste auch direkt in einer Schleife durchlaufen kann, ohne einen Index einzusetzen:

Code: Alles auswählen

for value in names:
    ...
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 ;)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

ice2k3 hat geschrieben:Vielleicht solltest du noch beachten, dass man Elemente einer Liste auch direkt in einer Schleife durchlaufen kann, ohne einen Index einzusetzen:

Code: Alles auswählen

for value in names:
    ...
Wenn er die Liste aber in-place manipulieren will, nutzt ihm das mit dem direkten Iterieren nicht so viel.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
sm00ve
User
Beiträge: 4
Registriert: Freitag 12. Februar 2010, 09:42

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 :)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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:

Code: Alles auswählen

newlist = [float(value) for value in names]
Schöner, schneller, eleganter!
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

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 :roll: . 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)
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.
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

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 ;)
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.
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

okili es lauft alles jetzt! danke!

P.S.: Die Sache mit dem Datum hab ich selbst geloest
Antworten