Erstellen einer csv Datei

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
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Wenn es WertA,WertB schreibt, scheinst du als Trenner ein ',' zu verwenden.
Vieleicht musst du einen anderen Dialket verwenden...
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

Ja danke es funktioniert.

writer = csv.writer(open("grafik.csv", "wb"), delimiter=";")
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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)
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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)`.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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]
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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)
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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`.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
Antworten