unerwünschte Leerzeile bei Datenspeicherung in 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
bachatero18
User
Beiträge: 43
Registriert: Montag 12. August 2019, 13:57

Moin Leute,

ich hab heute mal mit Python 2.7.14 angefangen und hab doch glatt ein Problem.

Ich lese ein Array von Arduino Nano aus und will sie am COM3 abholen funktioniert auch alles gut.

Das Problem ist wenn ich die Daten zeilenweise in eine .csv speicher macht er mir immer eine Leerzeile in der .csv Datei.

Beispiel:
Werte1
leerzeile
Werte2
leerzeile

bei einer .txt macht er das nicht und ich verstehe nicht ganz wieso weshalb warum er das macht und wie ich das verhindern kann.

Wäre Gut wenn ihr da eine Lösung hättet und wie gesagt hab vorhin gerade erst mit Python angefangen.

Danke schon mal

Code: Alles auswählen

import serial

ser = serial.Serial('COM3', baudrate = 2000000, timeout=1

while 1:
	arduinoData = ser.readline() .decode('ascii')
	print(arduinoData)
	file=open("test.csv","a")
	file.write(arduinoData)
	file.close()
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bachatero18: Heute mit Python 2.7 anzufangen ist ein bisschen spät: https://pythonclock.org/

Die Baudrate sieht merkwürdig aus, und die Zeile ist auch gar nicht zuende.

Wenn Du genau den selben Quelltext hast und nur die Dateiendung unterschiedlich ist, dann schreibt Python die gleichen Daten. Wenn Du da einen Unterschied siehst, dann liegt das an dem Programm oder den Programmen mit denen Du Dir die Daten danach anschaust.

`Serial`-Objekte sind Kontextmanager – die kann man mit ``with`` benutzen. Genau wie man das auch bei der Datei machen sollte.

Die Datei immer wieder zu öffnen und zu schliessen ist ineffizient. Warum öffnest Du die nicht einmal am Anfang, vor der Schleife?

`Serial`-Objekte sind ausserdem über ihre Zeilen iterierbar. Da kann man also einfach eine ``for``-Schleife drüber schreiben statt der ``while``-Schleife. Wo man anstelle der 1 auch besser `True` schreiben würde.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Eingerückt wird mit vier Leerzeichen pro Ebene.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
bachatero18
User
Beiträge: 43
Registriert: Montag 12. August 2019, 13:57

Erstmal danke für die Antwort.

Ja die Klammer habe ich zum Schluss vergessen zu schreiben hast du recht.
Die Baurate ist identisch wie der Arduino also schon Ok.

Gibt es Beispiele mit " with " hab da gestern Tatsächlich was gefunden nur ich finde das nicht wieder.

Ja, dass er die Datei immer öffnet und schließt ist mir auch aufgefallen die Hoffung war, dass er das Array empfängt und dann schließt aber das macht er nicht. Er nimmt wirklich jeden Wert einzeln. Nur ich weiß es nicht besser hab dazu auch keine geeignete Lektüre wo man einfach Beispielcodes hat und bisschen was erklärt ist mit den Basics.

Gibt es irgendwo geeignete Lektüren Bücher o.ä die das fürn Anfänger gegeignet sind?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Gute Bücher, die einem Anfänger das erklären, kenne ich nicht. Man schaut sich das einfach an guten Beispielen ab:

Code: Alles auswählen

import serial

with serial.Serial('COM3') as input, open("test.csv", "a") as output:
    for line in input:
        line = line.decode('ASCII')
        print(line.rstrip())
        output.write(line)
bachatero18
User
Beiträge: 43
Registriert: Montag 12. August 2019, 13:57

hab den code mal eingegeben.

Also der schließ die Datei gar nicht mehr dem entsprechend kann ich sie nicht öffnen und Daten kann ich auch nicht sehen falls er überhaupt welche schreibt.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bachatero18: ``with`` kommt im Tutorial in der Python-Dokumentation vor, im Abschnitt „Reading and Writing Files“ mit Beispiel für eine Datei. Dann ist das Schlüsselwort selbst natürlich in der Referenzdokumentation mit einem allgemeinen Beispiel wo man auch sieht was Sirius3 gemacht hat: mehr als ein Objekt mit einem ``with`` zu verwenden. Dort ist ein Link auf einen Abschnitt für Kontextmanager allgemein und an den beiden letztgenannten Stellen ist ein Link auf „PEP343 The with statement“ wo die Spezifikation und die Motivation hinter dieser Einweisung dokumentiert ist. Auch mit Beispielen.

Das `Serial`-Objekte Kontextmanager sind, also mit ``with`` verwendet werden können, sieht man in der PySerial-Dokumentation gleich am Anfang im Abschnitt „Short inrtroduction“ der überwiegend aus kleinen Beispielen besteht.

Was für ein Array? Du liest da ja *Zeilen*. Was erwartest Du denn wie die aussehen? Was steht da drin? Wenn Du Binärdaten erwartest, dann darfst Du nicht `readline()` verwenden. Mir fällt auch gerade auf das Du einen Timeout setzt, im Code selbst dann aber die Fälle die dadurch entstehen können gar nicht behandelst‽

@Sirius3: Dein Beispiel entfernt doch jetzt aber alle Zeilenenden aus den Daten und schreibt alles in die gleiche Zeile in die Datei. Wenn da b'12\n3\n' gesendet wird, kann man das in der Datei nicht mehr von b'1\n23\n' unterscheiden weil da nur noch b'123' drin steht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten