Seite 1 von 1

Erstellen einer csv Datei

Verfasst: Donnerstag 18. Februar 2010, 20:57
von lodder
Hallo zusammen

Ich habe folgendes Problem.
Ich möchte in Excel eine Grafik erzeugen aus gewonnen Werten, die in einer CSV-Datei stehen. Hier mal ein kleines Beispiel

import csv
writer = csv.writer(open("grafik.csv", "wb"))
writer.writerow(['WertA','WertB'])


Wenn ich nun die erstellte Exel-CSV mir anschaue, steht in Spalte A: WertA,WertB.

Ich möchte aber, dass WertA in Spalte A steht und WertB in Spalte B

Was muss ich da im Code noch ändern???

Danke schon im Voraus für die Hilfe.

[/url][/quote][/code]

Verfasst: Donnerstag 18. Februar 2010, 21:01
von cofi
Du musst die Datei mit Excel richtig importieren. CSV benutzt wie der Name schon sagt Kommas um die Werte zu trennen, in den deutschen Locales wird afaik mit `;` importiert.
Also entweder aenderst du das Trennzeichen oder den Import in Excel.

Verfasst: Donnerstag 18. Februar 2010, 21:06
von ...
Wenn es WertA,WertB schreibt, scheinst du als Trenner ein ',' zu verwenden.
Vieleicht musst du einen anderen Dialket verwenden...

Verfasst: Donnerstag 18. Februar 2010, 21:13
von lodder
Ja danke es funktioniert.

writer = csv.writer(open("grafik.csv", "wb"), delimiter=";")

Verfasst: Donnerstag 18. Februar 2010, 21:57
von lodder
Jetzt habe ich schon die nächste Frage:

Habe das einfache programm von oben jetzt ein bißchen abgeändert. Hab mir ne Funktion geschrieben, die nur den Kopf in eine CSV Datei schreibt.
in Spalte A: Wert A
in Spalte B: Wert B

Nur leider erscheint folgendes:
W e r t A
W e r t B

verstehe ich jetzt nicht warum

Verfasst: Donnerstag 18. Februar 2010, 22:02
von lodder
Sorry hier natürlich der Code:

Code: Alles auswählen

import csv

def sWRITE_NEW_TABLE_FIRSTLINE(sText, sFilename):
    i = len(sText)
    print i
    k = 0
    writer = csv.writer(open('%s'%sFilename, "wb"), delimiter=";")
    while(k < i):
        try:
            writer.writerow(sText[k])
        except:
            print 'File creation %s failed' %sFilename
        k += 1
    writer.writerow('\n\n')
    print 'File %s created / updated\n' %sFilename

stext = ['Wert A', 'Wert B']
sfilename = 'Versuch.csv'

sWRITE_NEW_TABLE_FIRSTLINE(stext, sfilename)

Verfasst: Donnerstag 18. Februar 2010, 22:05
von ...
Das liegt daran, das du nur stext[0] oder stext[...n] in wiriterow schreibst, würde ich behaupten.

Versuche die Whileschleife zu lassen, und schreibe sText nicht sText[k]

writerow verlangt doch eine Sequenz.
Eine Sequenz wäre eine Liste aus Strings, oder ein String.
Du übergibst einen String... dieser wird dann also in Chars zerlegt.
Ansonsten würde die Liste aus Strings in Strings zerlegt.

Verfasst: Donnerstag 18. Februar 2010, 22:30
von cofi
Ok da liegt so einiges im argen.

1. HN stoert in Python nur, gelinde gesagt ist HN auch eine luege, da Python-Namen nicht typisiert sind. Bei stext stimmt sie ausserdem so gar nicht.
2. In Zeile 11 ist die Datei schon erstellt, deine Fehlermeldung ist falsch. Auch solltest du keine blanken `except`s benutzen.
3. Du kannst dir den Formatstring in Zeile 8 sparen.
4. Solltest du die Datei extra oeffnen, sonst kannst du sie nicht schliessen. (das man evtl lieber den writer uebergibt kommt noch dazu).
5. In Python gibt es dieses nette Konstrukt der for-Schleife ;)

Um dein eigentliches Problem zu loesen: Wirf die schleife weg und schreibe nur einmal mit `writer.writerow(sText)`.

Verfasst: Freitag 19. Februar 2010, 09:07
von lodder
Ich hab jetzt mal den Code leicht abgeändert.
Allerdings würde ich gerne die geöffnete Datei wieder schließen. Jetzt hat der cofi geschrieben, ich müsse die Datei extra öffnen. Dies soll aber erst in der Funktion passieren. es klappt irgendwie net so wie ich mir das wünsche.
Jemand eine idee?[/img]

Verfasst: Freitag 19. Februar 2010, 09:08
von lodder
hier der code:

Code: Alles auswählen

def sWRITE_NEW_TABLE_FIRSTLINE(lText, sFilename):
    try:
        writer = csv.writer(open('%s'%sFilename, "wb"), delimiter=";")
        writer.writerow(lText)
    except:
        print 'File creation %s failed' %sFilename
    writer.writerow('\n\n')
    print 'File %s created / updated\n' %sFilename

ltext = ['Wert A', 'Wert B']
sfilename = 'Versuch.csv'


sWRITE_NEW_TABLE_FIRSTLINE(ltext,sfilename)

Verfasst: Freitag 19. Februar 2010, 09:17
von cofi

Code: Alles auswählen

def write_headers(headers, filename):
    with open(filename, 'w') as fobj:
        writer = csv.writer(fobj, delimiter=';')
        writer.writerow(headers)
        writer.writerow('\n\n')

headers = ['A', 'B']
filename = 'Versuch.csv'

write_headers(headers, filename)

Verfasst: Freitag 19. Februar 2010, 09:35
von lodder
Hallo Cofi

erstmal Danke für die Antwort. Wie du sicherlich bemerkt hast, habe ich noch wenig Erfahrung. Deshalb vielleicht auch die komischen Fragen.

In Zeile 2 wird also filename geöffnet als fobj und die datei ist hier in diesem Beispiel bis Zeile 5 geöffnet. Anschließend wird sie wieder geschlossen. Habe ich das so richtig verstanden.

Verfasst: Freitag 19. Februar 2010, 09:44
von cofi
Richtig. Wenn du kein Python 2.6+ hast musst du da leider `try...finally` zum schliessen nehmen.
Ich wollte damit zeigen, dass `csv.writer` ein File-objekt entgegen nimmt, das muss nicht notwendigerweise da geoeffnet werden (sollte v.a. nicht, eben da man die Ressource nicht schliessen kann).

Will man die Ausnahmebehandlung fuer die IOError noch dazunehmen, dann umschliesst man die with-Suite mit `try...except IOError, e: ...` Aber nicht mit einem blanken `except`.

Verfasst: Samstag 20. Februar 2010, 12:43
von lodder
Hallo

Folgendes Problem. ich möchte in einer csv.Datei Zeilen mit Werten hinzufügen. Das klappt auch nur leider ist immer zwischen den Werten eine Zeile frei (Excel).Was muss ich abändern bzw. hinzufügen, damit in Zeile 2 die ersten Werte stehen, Zeile 3 die nächsten usw. ?

Code: Alles auswählen

def write_append_table_line(lData, sFilename):
    with open(sFilename, 'a') as fobj:
        try:
            writer = csv.writer(fobj, delimiter=';')
            writer.writerow(lData)
            print 'File %s created / updated\n' %sFilename
        except IOError:
            print 'File creation %s failed' %sFilename

Verfasst: Montag 22. Februar 2010, 14:56
von mkesper
cofi hat geschrieben:Richtig. Wenn du kein Python 2.6+ hast musst du da leider `try...finally` zum schliessen nehmen.
Ab 2.5 gibt es

Code: Alles auswählen

from __future__ import with_statement
Wenn es darum geht, Daten nach Excel zu bringen, würde ich übrigens xlwtempfehlen.