Seite 1 von 1

csv.reader not subscriptable

Verfasst: Donnerstag 22. Juli 2010, 17:43
von p90
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?

Re: csv.reader not subscriptable

Verfasst: Donnerstag 22. Juli 2010, 18:08
von cofi
Schau dir mal an, wo dein Code von dem Beispiel abweicht.

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

Re: csv.reader not subscriptable

Verfasst: Donnerstag 22. Juli 2010, 18:27
von BlackJack
@p90: Und darüber iterieren können heisst nicht, das man an beliebigen Indexen zugreifen kann.

Re: csv.reader not subscriptable

Verfasst: Donnerstag 22. Juli 2010, 20:08
von p90
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 ^^

Re: csv.reader not subscriptable

Verfasst: Donnerstag 22. Juli 2010, 20:34
von cofi
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])

Re: csv.reader not subscriptable

Verfasst: Donnerstag 22. Juli 2010, 20:40
von noisefloor
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

Re: csv.reader not subscriptable

Verfasst: Freitag 23. Juli 2010, 00:43
von p90
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!