Textdatei zeilenweise schreiben

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
TechnoFeather
User
Beiträge: 20
Registriert: Freitag 24. Juli 2009, 11:07

Hallo zusammen,

ich habe nochmal eine Frage: Mein Skript funkioniert soweit sehr gut, nun möchte ich allerdings, dass meine Konsole auch in eine log.txt ausgegeben wird. Das klappt, jedoch muss ich das Skript beenden, damit die Daten geschrieben werden. Ich möchte es gerne "Live" schreiben - wie in der Konsole zu sehen ist.

Code: Alles auswählen

class Tee(object):
    def __init__(self, *files):
        self.files = files
    def write(self, obj):
        for f in self.files:
            f.write(obj)

original_stdout = sys.stdout
f = open("log.txt","a")
sys.stdout = Tee(sys.stdout, f)

while True:
    sys.stdout.write("Warte 10 sekunden...")
    time.sleep(10)

f.close()
f.close()* wird schonmal nicht aufgerufen, dass ist noch eine kleine Baustelle, aber was für mich wichtiger ist, ist die Ausgabe in die log-Datei nach jedem stdout.write.

Wie kann ich das bewerkstelligen? Jedesmal schließen und wieder öffnen fühlt sich erstmal nicht effizient an - da muss es doch noch einen anderen weg geben?

Edit: * = da das Skript entweder selbst durch einen neustart den PCs brachial beendet wird oder es schlicht und ergreifend Monate durch läuft.
BlackJack

@TechnoFeather: Du müsstest nach jedem Schreibvorgang einen `flush()`-Aufruf machen damit die Daten nicht nur in einem Puffer landen der erst rausgeschrieben wird wenn er voll ist, sondern sofort. Den würde ich auf dem `Tee`-Objekt zur Verfügung stellen damit er dann auf den ganzen enthaltenden Dateien ausgeführt wird. Ein `close()` könnte man da vielleicht auch anbieten.
TechnoFeather
User
Beiträge: 20
Registriert: Freitag 24. Juli 2009, 11:07

Ha! Danke. :) Flush hat mich auf die richtige fährte gebracht. Geht übrigens auch mit einem "unbuffertem" öffnen: f = open("log.txt","a", 0)
Antworten