csv.py writerow - Fehler

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
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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

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.
Zuletzt geändert von ms4py am Mittwoch 4. November 2009, 18:14, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Im uebrigen kannst du direkt ueber `data` iterieren. Und PEP8 solltest du auch mal anschaun ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Zeile 6:

Code: Alles auswählen

data[k,:]
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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

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.
Zuletzt geändert von ms4py am Mittwoch 4. November 2009, 18:32, insgesamt 1-mal geändert.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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.
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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?
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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

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.
amiganer68
User
Beiträge: 18
Registriert: Mittwoch 1. Juli 2009, 14:20

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
Antworten