Seite 1 von 1

Textdatei zeilenweise schreiben

Verfasst: Donnerstag 16. April 2015, 12:20
von TechnoFeather
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.

Re: Textdatei zeilenweise schreiben

Verfasst: Donnerstag 16. April 2015, 12:44
von 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.

Re: Textdatei zeilenweise schreiben

Verfasst: Donnerstag 16. April 2015, 12:56
von TechnoFeather
Ha! Danke. :) Flush hat mich auf die richtige fährte gebracht. Geht übrigens auch mit einem "unbuffertem" öffnen: f = open("log.txt","a", 0)