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]
Erstellen einer csv Datei
- 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.
Also entweder aenderst du das Trennzeichen oder den Import in Excel.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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
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
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)
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.
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.
- 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)`.
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)`.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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]
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]
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)
- 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)
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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.
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.
- 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`.
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`.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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. ?
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
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
Ab 2.5 gibt escofi hat geschrieben:Richtig. Wenn du kein Python 2.6+ hast musst du da leider `try...finally` zum schliessen nehmen.
Code: Alles auswählen
from __future__ import with_statement