csv.reader not subscriptable

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
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

bin ein Python Anfänger und wollte als Anfangsprojekt einen kleinen Gravitationssimulator schreiben. Ich möchte dazu die entsprechenden Körper aus einer csv-datei auslesen.
Ich hab dazu erst mal hier nachgelesen: http://docs.python.org/library/csv.html
Als Bsp steht hier:

Code: Alles auswählen

import csv
spamReader = csv.reader(open('eggs.csv'), delimiter=' ', quotechar='|')
for row in spamReader:
      print ', '.join(row)
Bei mir sieht das so aus:

Code: Alles auswählen

import csv

def csvreader(filename,delim):
	print "analyzing ",filename
	csv_in = csv.reader(open("C:" + filename, "rb"), delimiter=';')
	#csv_in = pylab.csv2rec(file, checkrows=0, skiprows=1, delimiter=delim, names='name,position,speed,mass')
	name = []
	position = []
	speed = []
	mass = []
	koerper=[]
	for row in csv_in:
		name.append(csv_in[row][0])
		position.append(array(float(csv_in[row][1]),float(csv_in[row][2])))
		speed.append(array(float(csv_in[row][3]),float(csv_in[row][4])))
		mass.append(float(csv_in[row][5]))
	koerper = [name, position, speed, mass]
	csv_out = koerper
	return csv_out
Er wirft mir aber immer:

Code: Alles auswählen

TypeError: '_csv.reader' object is not subscriptable
Der Fehler sollte doch nur auftreten wenn das Objekt nicht iterativ ist, csv.reader sollte aber iterativ sein.
Hat jemand einen Tipp für mich?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Schau dir mal an, wo dein Code von dem Beispiel abweicht.

Und "iterable" != "iterativ", sondern "darueber iterierbar".
BlackJack

@p90: Und darüber iterieren können heisst nicht, das man an beliebigen Indexen zugreifen kann.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Ah okay,

habs endlich hinbekommen.
Sieht jetzt so aus:
[hab auch noch was an dem Programm geändert, also nicht wundern]

Code: Alles auswählen

def csvreader(filename,delim):
    print "analyzing ",filename
    csv_in = csv.reader(open("C:" + filename, "rb"), delimiter=';')
    #csv_in = pylab.csv2rec(file, checkrows=0, skiprows=1, delimiter=delim, names='name,position,speed,mass')
    koerper=[]
    #Name, Positionx, Positiony, Speedx, Speedy, Masse
    for row in csv_in:
                koerper.append([row[0], [float(row[1]),float(row[2])], [float(row[3]),float(row[4])], float(row[5])])
    csv_out = koerper
    return koerper

[EDIT]
das mit dem iterieren verstehe ich leider noch nicht so ganz aber dsa wird hoffentlöich noch.
Finde für mein ersten Python Programm schlage ich mich doch ganz gut auch wenn da noch zu viel C und VB6 drin ist ^^
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Statt

Code: Alles auswählen

#Name, Positionx, Positiony, Speedx, Speedy, Masse
for row in csv_in:
    koerper.append([row[0], [float(row[1]),float(row[2])], [float(row[3]),float(row[4])], float(row[5])])
willst du

Code: Alles auswählen

for row in csv_in:
    name, x_pos, y_pos, x_speed, y_speed, mass = row
    koerper.append([name, [float(x_pos),float(y_pos)], [float(x_speed),float(y_speed)], float(mass)])
nutzen, Stichwort `tuple unpacking`.

Oder:

Code: Alles auswählen

for row in csv_in:
    name, x_pos, y_pos, x_speed, y_speed, mass = row[0], map(float, row[1:])
    koerper.append([name, [x_pos, y_pos], [x_speed, y_speed], mass])
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
das mit dem iterieren verstehe ich leider noch nicht so ganz aber dsa wird hoffentlöich noch.
Ja, hoffentlich. ;-) Iterieren ist nämlich sehr praktisch. :-)

Iterieren heißt, das du Schritt für Schritt über ein iterierbares Objekt gehst. Und in Python ist ziemlich viel iterierbar...

Im Tutorial findest du sicherlich ein paar Beispiele. Oder führ' mal den folgenden Code aus:

Code: Alles auswählen

liste1 = ['foo','bar']
liste2 = [['foo','bar'],['spam','egg']]
text = 'spamegg'
for i in liste1:
    print(i)
for i in liste2:
    print(i)
for i in liste2:
    for j in i:
        print(j)
for i in text:
    print(i)
Iterierbar sind aber auch z.B. die Zeilen einer Text-Datei, das Ergebnis einer DB-Abfrage (zumindest, wenn das DB-Modul die Python DB API erfüllt) usw.

Gruß, noisefloor
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,
@cofi
das sieht wesentlich schöner aus als das was ich da hatte.

@noisefloor
also das man das machen kann hatte ich schon gesehen.
Mal noch etwas rumprobieren.

Aber erst mal Danke an alle die mir hier geholfen haben!
Antworten