Python Shell Ausgabe in Datei speichern

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo!

    Ich bin ganz neu in der Programmierung.

    ... ich hab ein Programm geschrieben welches eine empfangene (RFID) ID zusammen mit Zeit und Datum in die Shell ausgibt bzw in eine Datei schreibt. Das Problem ist dass die Daten erst in die Datei geschrieben werden sobald diese geöffnet wird... Bei einem möglichen Stromausfall etc gehen die Daten also verloren. Kann mir vielleicht jemand helfen und erklären wie ich die Ausgabe gleichzeitig in der Datei speichern kann ohne diese öffnen zu müssen :conf:


    Ich hab jetzt benutzt

    file.write

    print

    file.flush()

    file.close()


    :/

  • Go to Best Answer
  • Hallo!

    Ich habe ein Programm für ein RFID System geschrieben. Dieses Programm gibt eine gelesene ID zusammen mit Datum und Zeit in die Shell aus soll dieses aber gleichzeitig auch in eine Datei schreiben damit bei einem Stromausfall die Daten nicht verloren gehen...

    An sich funktioniert der erste Teil des Skriptes auch gespeichert werden die Daten aber leider erst beim öffnen der Datei...


    Hier der entscheidende Teil des Skriptes :


    while True:

    daten = ser.read(10)

    now = datetime.today()

    datum = now.strftime("%Y-%m-%d")

    zeit = now.strftime("%X")

    file.write(datum + "\t" + zeit + "\t" + str(daten) + "\n")

    print(datum + "\t" + zeit + "\t" + str(daten))

    file.flush()

    file.close()

  • Hallo,


    was heißt denn "gespeichert werden die Daten erst beim Öffnen der Datei?" Wer öffnet wann wie? Grundsätzlich kann man nur in geöffnete Dateien schreiben...


    Zeig' auch mal bitte den _kompletten_ Code. Es fehlt das Öffnen der Datei. In den Code in einen Codeblock setzen (ist die </> Schaltfläche in der Editor-Leiste, damit die Einrückungen sichtbar sind.

    file.flush() sollte eigentlich überflüssig sein.

    Strings formatiert man mit f-Strings oder mit der format-Methode, nicht mit + zusammen stückeln.

    Generell solltest du vielleicht über das CSV-Modul oder das logging-Modul nachdenken, statt dir selber was zu basteln. Oder vielleicht auch SQLite.


    Gruß, noisefloor

  • Ja also ich meine wenn ich die txt Datei öffne dann wird die Ausgabe der shell gespeichert. Nehme ich den Raspi aber vom Strom ohne die Datei vorher einmal geöffnet zu haben gehen die Daten verloren....

    • Best Answer

    Da du deinen ursprünglichen Code bereits gelöscht hast, hier die Sicherheitskopie. NSA is watching you :D




    Der with-Block ist ein Kontextmanager und schließt die offene Datei beim Verlassen des Blocks. Somit ist ein explizites file.close() überflüssig.

    Wichtig ist hier noch der Modus a. Steht für Append, also anhängen. Wenn die Datei vorhanden ist, wird sie nicht überschrieben, sondern erweitert.


    Anstatt die Trennzeichen selbst im String einzufügen, kann man join verwenden.


    Falls die Daten von ser.read() binär sind, sollten diese noch umgewandelt werden. Ich vermute aber mal, dass es sich um ASCII handelt.

  • Hallo!

    Super! Vielen lieben Dank, genau das hab ich gebraucht. :love:

  • Ahh... ich hab doch noch ein Problem. Also das klappt soweit jetzt ganz gut. Der schreibt die ID sowohl in die Shell wie auch in die Datei. Das ganze funktioniert auch bei einem Neustart, es wird in die selbe Datei geschrieben. Stürzt der Raspi allerdings ab bzw ist der Strom kurz weg und er startet sich danach wieder neu schreibt er die IDs zwar weiter in die Shell aber nicht mehr in die Datei. Das klappt nur nachdem die Datei gelöscht wird wieder... Ich verstehe aber nicht wieso... Woran kann das liegen?

  • Das ist ein komisches Problem.


    Normal sollte die funktion open eine Exception werfen, wenn sie eine Datei nicht öffnen kann.

    Da keine Exception kam, könnte es vielleicht am Dateisystem liegen.

    Was die Datei nach dem Crash noch lesbar?

  • Ja also die Daten die bis zum Crash eingegangen sind standen noch in der Datei. Alle die danach kamen nicht mehr. Ich hab es jetzt erstmal so gelöst, dass ich die Datei nicht nur mit aktuellem Datum erstelle sondern auch mit Uhrzeit. So wird nach dem Crash eine neue Datei angelegt und die Daten können wieder gespeichert werden. Ist zwar etwas unelegant aber funktioniert so......