Seite 1 von 1

csv_writer fügt leere Zeile an!

Verfasst: Dienstag 29. Dezember 2020, 23:24
von torsten_156
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

Re: csv_writer fügt leere Zeile an!

Verfasst: Dienstag 29. Dezember 2020, 23:30
von __blackjack__
@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?

Re: csv_writer fügt leere Zeile an!

Verfasst: Dienstag 29. Dezember 2020, 23:33
von Sirius3
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.

Re: csv_writer fügt leere Zeile an!

Verfasst: Mittwoch 30. Dezember 2020, 16:53
von torsten_156
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

Re: csv_writer fügt leere Zeile an!

Verfasst: Mittwoch 30. Dezember 2020, 17:41
von Sirius3
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)

Re: csv_writer fügt leere Zeile an!

Verfasst: Mittwoch 30. Dezember 2020, 19:02
von torsten_156
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

Re: csv_writer fügt leere Zeile an!

Verfasst: Mittwoch 30. Dezember 2020, 20:08
von __blackjack__
@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.