Python Script: automatisches Erstellen einer Datei wenn Datei voll

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Ich habe ein Python Skript geschrieben, welches jede Sekunde einen
    Messwert aufnimmt, und diesen mit einem Zeitstempel in eine txt. Datei
    schreibt.
    Das Problem ist nun, nach einer 2,5 Tagen ist die Datei 2,6 MB groß und es wird nichts mehr in die Datei geschrieben (wahrscheinlich weil die Datei zu groß wird).

    Ist es möglich, dass man das Skript so ändert, das nach jedem Tage (nach
    0:00 Uhr) eine Neue Datei erstellt wird ? , so das ich nach einer Woche
    7 txt. Dateien a ca. 1MB habe?


    Hier das jetzige Skript:

    Einmal editiert, zuletzt von Goldrausch (23. Februar 2014 um 14:21)

  • Python Script: automatisches Erstellen einer Datei wenn Datei voll? Schau mal ob du hier fündig wirst!

  • Also "voll" kan so eine Datei normal nicht werden - je nach Filesystem und verfügbarem Speicher sollte die Datei extrem groß werden können - 2,6MB sind ja eigentlich gar nichts. Denke mal eher, das das Problem da woanders liegt. Habe selbst schon Skripte zur Logfileauswertung z.B. geschrieben, bei denen die daraus entstandene .csv-Datei um einiges größer als 2,6MB wurde.

    Aber zu deiner anderen Frage: Jeden Tag eine neue Datei anlegen ist natürlich möglich. Ich würde die Dateien dann nach Datum benennen - also z.B. dateiname_23022014.txt. Dazu musst du bei jedem Schreibvorgang in die Datei erst einmal prüfen ob für das aktuelle Datum schon eine Datei existiert. Wenn ja, die Werte dort anfügen, wenn nein, Datei erstellen und Werte reinschreiben. Das Ganze lässt sich über eine if-Schleife realisieren.

    Noch eine Idee von mir: Warum nicht eine Datenbank dazu nutzen? Über SQLite z.B. eine einfache Tabelle mit einer Spalte mit den Timestamps anlegen und beliebig viele mit den Werten, die zum jeweiligen Zeitpunkt gespeichert werden sollen. Wäre die einfachere und elegantere Lösung ;)

  • ich habe die Datei jetzt folgendermaßen geändert:

    ich hoffe jetzt das die Datei größer als 2,6 MB wird.

  • Ich habe den Eindruck Du hast zwei Prozesse - einen DatenProducer und einen DatenConsumer und machst das über eine Datei messwert.txt. Dazu nimmt man normalerweise names Pipes und keine Dateien.

    Ich kann mir nicht vorstellen dass es an dem fehlende close liegt, aber wenn, dass solltest Du den input immer wieder closen nach dem Lesen. Allerdings kommt es auf die Einrückung in Deinem Programm an. Dazu solltest Du den Code Tag benutzen ;)

  • Hi framp,

    irgendwann ist die maximale Anzahl von Filedescriptoren nun mal erschöpft ;) ...
    Da hier zudem ein Fehlerhandling fehlt, schreibt der im Zweifelsfall nach NULL und zernagelt dabei - vermute ich zumindest - das Filesystem. Is ja root ...
    Ein Grund mehr, sich nicht permanent als root anzumelden.

    cu,
    -ds-

  • Er führt jede Sekunde erneut 2x open() aus aber läßt dabei jedesmal die open() in der Luft hängen... das geht halt nicht lange gut!

    Er brauch nur jeweils ein close() für jedes open() einfügen, nachdem er mit dem verarbeiten der Datei fertig ist und hat dann ruhe

    Code
    while True:
    with open ('messwert.txt' 'rb') as input
    value = input.read ()
     
    with open ('dateiname.txt','ab') as output:
    output.write ("%s\%s \n" % (datetime.datetime.now(),value))
    output.close()
     
    time.sleep(1)

    Da fehlt immer noch ein close() ! Du hast 2x open() also brauchst du auch 2x close()

    Korrekter wäre:

    Code
    while True:
    	with open ('messwert.txt', 'rb') as input:
    		value = input.read()
    		input.close()
     
    	with open ('dateiname.txt', 'ab') as output:
    		output.write ("%s\%s \n" % (datetime.datetime.now(), value))
    		output.close()
     
    	time.sleep(1)

  • irgendwann ist die maximale Anzahl von Filedescriptoren nun mal erschöpft ;) ...


    Jupp, das hatte ich auch gesehen. Ich habe aber zum Test mal ein kleines Prog in einer endless Loop staendig dassselbe File öffnen lassen und nach ein paar Minuten abgebrochen. So wie ich das sehe sorgt der Python GarbageCollector dafür, dass da keine Resourceshortage an Filehandles stattfindet.

    • Offizieller Beitrag

    Ganz interessant war das bei mir mal mit SQL. Ich hab ein TemperaturTool auf Arbeit laufen (inkl. SMS/Mail Alarmaierung usw). Dort hatte ich bei einem einem SQL.Connect das abschliessende Close() vergessen. Das ganze lief Wochenlang super, aber irgendwann starb es einfach und war erst durch einen Neustart des Windows Servers wieder in der Lage vernünftig zu arbeiten ;). Seitdem achte ich immer besonders auf solche "Kleinigkeiten" und schliesse Opens immer, auch wenn ich sie nur einmal brauche.

    • Offizieller Beitrag

    Lt. Doku, ruft with die __exit__ Funktion (im internen finally zweig) mit auf, was bei "with open" auch das Schliessen der Datei beinhaltet. Was das ganze jetzt natürlich mysteriös macht. ;). Ich würde es mal mit dem guten alten file.open;close() probieren und schauen ob der damit länger als 2 Tage überlebt. Ich nutze das auch bei anderen Projekten, allerdings schreibe ich auch nicht jede Sekunde in eine Datei. ;)

  • Naja er hatte aber auch noch 2 Fehler im Code - vergleicht mal die beiden Code Blöck in meinem Post dann seht ihr sie vielleicht (wer findet den Fehler) :D

    copy&past Fehler wird das nicht gewesen sein, höchtesns weils nicht im Code gepostet wurde aber selbst dann hätte es beim output auch falsch sein müssen.. einzige möglichkeit die über bleibt ist eben dass er dort tatsächlich 2 fehler hat


  • Lt. Doku, ruft with die __exit__ Funktion (im internen finally zweig) mit auf, was bei "with open" auch das Schliessen der Datei beinhaltet. Was das ganze jetzt natürlich mysteriös macht. ;). Ich würde es mal mit dem guten alten file.open;close() probieren und schauen ob der damit länger als 2 Tage überlebt. Ich nutze das auch bei anderen Projekten, allerdings schreibe ich auch nicht jede Sekunde in eine Datei. ;)

    Hi,

    logisch macht das Beenden eines Prozesses einen cleanup und gibt alle Resourcen frei ... das war unter UNIX schon immer so.
    Was hier Probleme macht ist ja imho der fehlende close() und die open() ohne Fehlerhandling.

    cu,
    -ds-

  • dreamshader: Ich schätze mal nachdem die with Schleife zuende ist ;) (Stichwort: Einrückung)


    Aber wie gesagt, der TE hatte in seinem Script 2 kleine aber vermutlich verheerende Fehler - diskutiert mal lieber darüber :D

  • Möglich ...

    da ich Python lediglich im Zusammenhang mit der Heimat der Frau meines Bruders kenne ( Pantanal ), hoffe ich, ihr urteilt nicht zu streng über meine Unwissenheit ;)

    Was meintest Du mit den zwei kleinen Fehlern? Hamma das was übersehen?

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!