seltsames Verhalten von file.write() bzw file.open() - bitte um hilfe

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
Koraktor
User
Beiträge: 12
Registriert: Samstag 2. August 2014, 18:32
Kontaktdaten:

in essenz:
ich habe eine .txt datei in der ich immer eine Zeile am ende hinzu fügen möchte. vereinfachung des Codes sieht so aus:

Code: Alles auswählen

with open(path, 'r+') as file:
	writeingProzedur(file, stuffToMakeString)
	
def writeingProzedur(self, openFIle, stuffToMakeString):
	#lese die erste Zeile für den Header check
	 if openFile.tell() != 0:
         	openFile.seek(0)
         	
         if fistLine == '':
         	openFIle.write(headerLine + '\n')
        	
	#code der den String generriert (nur eine Zeile lang) und funtzt
	#Beispiel: "TimeStamp, float1, float2, float3, float4, float5, float6"
	
	openFIle.write(stringToWrite + '\n')
der Code funktioniert wie beabsichtigit also er schreib die Header in die erste Zeile und fühgt die nen CSVs am ende hinzu.
aber aus irgendeinen grund hört das nach ca. 8000-9000 chars auf und der Code überschreibt stendig Teile der letzten Zeile.
ich verstehe offensichtlich irgendwas nich über write() oder open().
könntet ihr mir nen raht geben wo ich nach dem Fehler suchen kann?
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen und Funktionen schreibt man komplett klein. Vor allem schreibt man keine Variable openFIle mit großem I mitten drin.
Die Einrückungen sind kaputt, so dass den eigentlichen Code raten muß. Eingerückt wird immer mit 4 Leerzeichen pro Tabs. Vor allem mischt man nicht Tabs mit Leerzeichen.
Du übergibst writeingProzedur kein self, das wird aber auch gar nicht in der Funktion benutzt, also noch ein Fehler im Code.
firstLine und headerLine kommen aus dem Nichts.
Der Filemode r+ ist für Textdateien nie sinnvoll. Also entweder liest man eine Datei "r", Schreibt eine Datei komplett neu "w" oder hängt eine Zeile an "a". Alle anderen Modi sind fehlerhaft.

Aus diesem Code läßt sich das Verhalten nicht ableiten. Ich vermute, Du liest und schreibst gleichzeitig in die selbe Datei. Das geht nicht.
Koraktor
User
Beiträge: 12
Registriert: Samstag 2. August 2014, 18:32
Kontaktdaten:

@Sirius3
du gehst davon aus das ich mich an eine Notation halte. das tue ich nicht. wen du mir beibringen willst wie man sauberen Code schreibt, danke kein bedarf für dieses Projekt, vieleicht ein andermal.
der Code sieht deshalb so zerfetzt aus weil ich nur meine daten schnell in eine Txt datei hauen und weiter machen will. Ich programmiere nicht mit Python daher auch die etwas grundligende frage.
firstLine und headerLine kommen deshalb aus dem nichts weil es nicht für die Frage relevant ist wie sie erstellt werden und man davon ausgehen kann das man beim lesen versteht das das einfach nur 2 Strings sind (hätte vieleicht noch dazu schreiben sollen das die nicht auf \n enden).
ich kann es mir nur schwer vorstellen das Python interene Funktionen "Fehlerhaft" sind. wäre zumindes übels peinlich für eine Programmiersprache das so fundermentale sachen nicht funtzen.
Und offensichtlich kann ich in eine Datei schreiben und Lesen.

danke für den Versuch.
Benutzeravatar
Dennis89
User
Beiträge: 1555
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich möchte dich nicht angreifen, aber wenn ich deinen Text lese, frage ich mich, wie man von einem 'zerfetzen' Code ein perfektes Ergebnis erwarten kann und bei Fehler dann die Programmiersprache verantwortlich macht.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@Koraktor: ich weiß nicht, wie Dein Text Dir oder uns weiterhilft.
Und offensichtlich kannst Du NICHT in eine Datei schreiben und Lesen, sonst würdest Du ja nicht das Problem haben.

Nochmal der entscheidende Satz aus meinem Beitrag:
Sirius3 hat geschrieben: Montag 8. März 2021, 14:59Aus diesem Code läßt sich das Verhalten nicht ableiten.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Niemand hat gesagt, das r+ allgemein fehlerhaft ist. Es funktioniert wunderbar im Kontext von binaerdateien, bei denen man Bloecke an Daten an bekannten Stellen lesen und schreiben will. Aber eben NICHT fuer Textdateien, die zeilenweise arbeiten. Wie CSV.

Aber augenscheinlich weisst du eh alles besser :twisted:
Koraktor
User
Beiträge: 12
Registriert: Samstag 2. August 2014, 18:32
Kontaktdaten:

Ok, sorry guy hab das in den Falschen hals bekommen.
@Sirius3 auch an dich speziell: sorry.
wie ist das dan zu verstehen wen Sirius meint: "Alle anderen Modi [ausser 'r', 'w', 'a'] sind fehlerhaft." ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie schon gesagt: es funktioniert, wenn du blockweise binaere Daten schreibst. Das macht man eh selten (wenige Formate brauchen das), und fuer deinen Anwendungszweck ist es eben falsch. Weil das nunmal eine CSV-Datei ist, und da ist ja gerade der Witz, dass man keine festen Zeilenlaengen hat, sondern zwar eine feste Anzahl Spalten, aber die einzelnen Eintraege sind unterschiedlich lang. Die Trennung der Datensaetze erfolgt stattdessen durch einen Zeilenumbruch.

Du kannst also

- alle Zeilen einlesen, zB mit dem Modul csv, deine neuen Eintraege anhaengen, und alle Zeilen schreiben. Das ist am robustesten.
- wenn du sicher bist, dass du ein Zeilenende am Ende der Datei hast, mit "a" oeffnen, und einfach neue Zeilen schreiben. Auch das geht durchaus mit dem csv-Modul

Sofern die CSV-Datei nicht monstroes gross ist, nehme ich immer die erste Option. Denn wenn man das noch mit einem schreiben in eine temporaere Datei und dann rename zur alten Datei verknuepft, hat man quasi eine atomare Schreiboperation, statt ggf. Muell am Ende anzhaengen, weil der Rechner beim schreiben in die Knie gegangen ist, oder das Programm gekillt wurde.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein +-Modus wird ja nur gebraucht, wenn man nicht seriell Daten liest oder schreibt.
Text-Dateien lesen oder schreiben Zeichen. seek und tell operieren dagegen mit Bytes. Da aber Zeichen != Bytes ist da schon die erste Fehlerquelle.
Zudem werden, wenn man nicht am Ende einer Datei etwas anhängt, sondern mittendrin Zeichen schreibt, die Datei kaputt, weil halbe Zeilen oder halbe Zeichen überschrieben werden.
Antworten