csv_writer fügt leere Zeile an!

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
torsten_156
User
Beiträge: 43
Registriert: Freitag 5. April 2019, 20:10

Hallo,
ich lese mit meinem Script Wetterdaten aus und möchte diese in eine csv-Datei schreiben. Die Daten werden als Liste gehalten. Das Problem ist nun, dass mir in der csv-Datei nach dem Schreiben immer eine leere Zeile angefügt wird. Ich kann mir nicht erklären woher diese kommt. Meine Liste enthält definitiv nur vier Zeilen.

Hier die Werteliste:

Code: Alles auswählen

['2020-12-29 23:19:22;Ischgl;60;40', '2020-12-29 23:19:23;Planai / Schladming...;80;60', '2020-12-29 23:19:23;Obertauern;90;70', '2020-12-29 23:19:24;Großarl Tal - Ski...;90;50']
Und so speicher ich diese in einer csv-Datei:

Code: Alles auswählen

# Speichert die Liste als csv-Datei  'a+'
with open('C:\Temp\Schneewerte\Schneewerte.csv', 'a+') as csv_file:
   csv_writer = csv.writer(csv_file, delimiter="\n")
   csv_writer.writerow(Werte)
Wenn ich die csv-Datei öffne, enthält sie diese fünf Zeilen:
  • 2020-12-29 23:19:22;Ischgl;60;40
    2020-12-29 23:19:23;Planai / Schladming...;80;60
    2020-12-29 23:19:23;Obertauern;90;70
    2020-12-29 23:19:24;Großarl Tal - Ski...;90;50
    ...
(die drei Punkte am Ende der Liste habe ich hier hinzugefügt, damit man erkennen kann dass es hier fünf Zeilen sind)

Wie bekomme ich denn jetzt diese letzte Zeile dort weg?

Danke und Grüße
Torsten
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@torsten_156: "a+" ist falsch. "+" macht bei Textdateien im Grunde nie Sinn. Dann fehlt das `newline`-Argument. Siehe Dokumentation des CSV-Moduls. Und sollte da irgendein Zeichen ausserhalb von ASCII vorkommen, sollte man dringend auch die Kodierung beim öffnen angeben.

Das Trennzeichen ist "\n"? Ich glaube nicht. Laut Daten ist das ein Semikolon.

Wie kommst Du darauf, dass da am Ende eine Leerzeile ist? Ist die da tatsächlich, oder denkst Du bloss da ist eine?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Datei modus a+ ist definitiv falsch, weiter alle +Modi bei Textdateien.
Die Werte sind auch falsch und ein Newline akd delimiter auch.
Werte sind eine Liste von Listen, die am Strichpunkt aufgetrennt ist.
torsten_156
User
Beiträge: 43
Registriert: Freitag 5. April 2019, 20:10

Lasse ich das 'a+' weg, dann erhalte ich diesen Fehler (wenn es die Datei noch nicht gibt):

Code: Alles auswählen

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Temp\\Schneewerte\\Schneewerte.csv'
Wenn es die Datei gibt, erhalte ich dann diesen Fehler:

Code: Alles auswählen

UnsupportedOperation: not writable
Also habe ich den Parameter 'a+' wieder angegeben.

Wenn ich das

Code: Alles auswählen

delimeter="\n"
ändere in

Code: Alles auswählen

delimeter=";"
, schreibt er mir die Daten alle in eine Zeile! Also wieder mit "\n"

Dann habe ich noch den Parameter "newline=''". angegeben. Das wird es vermutlich gewesen sein. Denn jetzt erhalte ich keine leere Zeile am Ende mehr.

Der Code sieht nun so aus:

Code: Alles auswählen

# Speichert die Liste als csv-Datei  'a+'
with open('C:\Temp\Schneewerte\Schneewerte.csv', newline='') as csv_file:
   csv_writer = csv.writer(csv_file, delimiter="\n")
   csv_writer.writerow(Werte)
PS: die leere Zeile konnte ich im Editor "Notepad++" erkennen. Dort sind die Zeilen nummeriert ;-)

Vielen Dank und Grüße
Torsten
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie schon geschrieben, der richtige Dateimodus wäre "a" für Anhängen, nicht "a+". Niemand hat geschrieben, dass Du den Parameter ganz weglassen sollst.
Und Werte sollte eine Liste von Listen sein, was ich auch schon geschrieben habe, in der jetzigen Form kannst Du doch mit den Einträgen gar nichts anfangen.
Und natürlich wird die Zeile mit einem Zeile-Ende-Zeichen abgeschlossen, dafür ist es ja ein Zeile-ENDE-Zeichen geworden.

Code: Alles auswählen

werte = [
    ['2020-12-29 23:19:22', 'Ischgl', 60, 40],
    ['2020-12-29 23:19:23', 'Planai / Schladming...', 80, 60],
    ['2020-12-29 23:19:23', 'Obertauern', 90, 70],
    ['2020-12-29 23:19:24', 'Großarl Tal - Ski...', 90, 50],
]

with open('C:/Temp/Schneewerte/Schneewerte.csv', 'a', newline='') as csv_file:
   csv_writer = csv.writer(csv_file, delimiter=";")
   csv_writer.writerows(werte)
torsten_156
User
Beiträge: 43
Registriert: Freitag 5. April 2019, 20:10

Hallo Sirius3,

das mit dem 'a' und 'a+' habe ich verstanden. Ok,...
Aber das mit der Liste noch nicht ganz! Wenn ich mein Script laufen lasse, erhalte ich folgende Daten in meiner csv-Datei:
2020-12-30 18:59:02;Ischgl;60;40
2020-12-30 18:59:02;Planai / Schladming...;80;60
2020-12-30 18:59:03;Obertauern;90;70
2020-12-30 18:59:03;Großarl Tal - Ski...;90;50
Das ist genau das was ich benötige! Werte, die durch ein Semikolon getrennt sind. Was ist falsch daran???

VG
Torsten
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@torsten_156: Das die Werte nicht die Form haben wie das `csv`-Modul die erwartet und Du deswegen das `csv`-Modul falsch verwendest um dieses Ergebnis zu erreichen. Wenn Du die Daten nicht in der richtigen Form vorliegen hast, dann musst Du die entweder in die richtige Form bringen, oder aber nicht das `csv`-Modul verwenden, wenn Du gar keine Daten vorliegen hast die man mit dem Modul schreiben würde.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten