Seite 1 von 1

csv.py writerow - Fehler

Verfasst: Mittwoch 4. November 2009, 18:06
von redbomberle
Hi zusammen,
ich bin verzweifelt auf Fehlersuche, warum mein Programm sich beendet wenn ich dateien in ein file schreiben möchte:


hier die methode mit der ich die Daten speichern kann:

Code: Alles auswählen

def storedata(data,filename):
    wobj=open(filename,"w")
    writer=csv.writer(wobj, delimiter=",")
    print(len(data))
    for k in range(0,len(data)):
            writer.writerow(data[k,:]) #hier springt er raus, keine ahnung wieso
    wobj.close
hier die Ausgabe von data und was vielleicht sonst noch so hilfreich ist:

Code: Alles auswählen

len(data) = 2
data[0] = [1791, 11867, 21950, 31966, 41994]
data[1] =[2034, 12025, 22040, 32037, 42056]
data = [[1791, 11867, 21950, 31966, 41994], [2034, 12025, 22040, 32037, 42056]]

Ps: diese Methode rufe ich 4 mal auf (mit unterschiedlichem data).
2mal klappts, 2mal klappts nicht. Das ist echt zum verrückt werden.

Verfasst: Mittwoch 4. November 2009, 18:13
von ms4py
Vielleicht sagst du mal die Fehlermeldung?!
Kristallkugel funktioniert mal wieder nicht...

Edit: Außerdem sollte man Dateien immer innerhalb try..finally oder mit with öffnen.

Verfasst: Mittwoch 4. November 2009, 18:13
von cofi
Im uebrigen kannst du direkt ueber `data` iterieren. Und PEP8 solltest du auch mal anschaun ;)

Verfasst: Mittwoch 4. November 2009, 18:16
von numerix
Zeile 6:

Code: Alles auswählen

data[k,:]

Verfasst: Mittwoch 4. November 2009, 18:21
von redbomberle
ice2k3 hat geschrieben:Vielleicht sagst du mal die Fehlermeldung?!
Kristallkugel funktioniert mal wieder nicht...

Edit: Außerdem sollte man Dateien immer innerhalb try..finally oder mit with öffnen.
hey ja sorry ;)
ist schon alles in try catch verpackt, deshalb läuft das Programm auch noch weiter, aber er schreibt mir halt nichts ins File.

habe jetzt zusätzlich folgendes in try-catch verpackt, aber wie bitte komme ich jetzt an die Fehlermeldung?

Code: Alles auswählen

for k in range(0,len(data)):
        try:
            writer.writerow(data[k,:])
        except:
            print ("Error: couldnt write ")

Verfasst: Mittwoch 4. November 2009, 18:25
von ms4py
redbomberle hat geschrieben: ist schon alles in try catch verpackt, deshalb läuft das Programm auch noch weiter, aber er schreibt mir halt nichts ins File.
Autsch! Das ist sehr schlechter Stil. Man sollte eigentlich NIE ein allgemeines try .. except machen, sondern immer nur gezielt eine bestimmte Ausnahme abfangen!

Edit:
Warum iterierst du eigentlich nicht direkt über ``data``, wie bereits geschrieben.

Code: Alles auswählen

for row in data:
    writer.writerow(row)
Edit2:
Vermutlich mischst du die Datentypen list und numpy.array
Eine Liste kannst du nicht mit data[k,:] indexieren, sondern nur mit data[k][:]. Mit der direkten Iteration über ``data`` sollte der Fehler allerdings dann behoben sein.

Verfasst: Mittwoch 4. November 2009, 18:31
von yipyip

Code: Alles auswählen

data[k,:]
ergibt einen TypeError, der durch 'try...except' unterdrueckt wird.
Versuchs mal mit:

Code: Alles auswählen

import csv

data = [[1791, 11867, 21950, 31966, 41994], [2034, 12025, 22040, 32037, 42056]]

def storedata(data, filename):
  
  with open(filename, "w") as fp:    
    writer = csv.writer(fp, delimiter=",")
    writer.writerows(data) 

storedata(data, "testcsv")
:wink:
yipyip

Verfasst: Mittwoch 4. November 2009, 19:12
von redbomberle
hey vielen dank schonmal euch allen

ich probiers gerade mit den iterationen.
muss nur prüfen ob die in der richtigen Formatierung in das File geschrieben werden.

Verfasst: Mittwoch 4. November 2009, 20:12
von redbomberle
noch eine Kleinigkeit:

Wisst ihr wieso bei

Code: Alles auswählen

writerow() #ebenso bei writerows() 
in die Ausgabedatei immer ein newline eingefügt wird, bzw. wie man dies verhindern kann?

Verfasst: Mittwoch 4. November 2009, 20:24
von Pekh
Weil eine Zeile (=row) nun mal mit einem Newline-Zeichen beendet wird.

Ohne jetzt noch mal nachgeschlagen zu haben: Ich glaube nicht, daß die API von csv es erlaubt, weniger als eine komplette Zeile zu schreiben. Du wirst also alles, was du in eine Zeile haben willst, vorher zusammenfügen müssen. Schau dir in dem Zusammenhang mal die Listenfunktionen .append() und .extend() an.

Verfasst: Mittwoch 4. November 2009, 21:27
von ms4py
Pekh hat geschrieben:Weil eine Zeile (=row) nun mal mit einem Newline-Zeichen beendet wird.

Ohne jetzt noch mal nachgeschlagen zu haben: Ich glaube nicht, daß die API von csv es erlaubt, weniger als eine komplette Zeile zu schreiben. Du wirst also alles, was du in eine Zeile haben willst, vorher zusammenfügen müssen. Schau dir in dem Zusammenhang mal die Listenfunktionen .append() und .extend() an.
Oder das Modul ``itertools``. Die Methode

Code: Alles auswählen

def flatten(listOfLists):
    return list(chain.from_iterable(listOfLists))
wäre bei deiner Struktur sinnvoll.

Verfasst: Donnerstag 5. November 2009, 16:50
von amiganer68

Code: Alles auswählen

import csv

data = [[1791, 11867, 21950, 31966, 41994], [2034, 12025, 22040, 32037, 42056]]

def storedata(data, filename):
  
  with open(filename, "w") as fp:    
[...]
[/quote]

Nebenfrage: ich habe gerade in den aktuellen Online-Docs nach with gesucht und nichts gefunden, wo ist dieses genau beschrieben?

MfG
Christian

Verfasst: Donnerstag 5. November 2009, 17:02
von Pekh