2013-09-24 8 views
31

Ich erkannte Datei, wenn ich in eine Datei Python es bis zum Ende meiner Python-Datei, um sie auszuführen warten mit schreiben:Python 2.7: Schreiben Sie sofort

outputFile = open("./outputFile.txt","a") 
outputFile.write("First") 
print "Now you have 10sec to see that outputFile.txt is still the same as before" 
time.sleep(10) 
outputFile.write("Second") 
print "Now if you look at outputFile.txt you will see 'First' and 'Second'" 

Wie bin ich nehme an Python Schreib sofort machen zur Ausgabedatei?

Antwort

47

Sie können flush() verwenden oder Sie können das Dateiobjekt als ungepuffert festlegen.

Details zur Verwendung dieses Parameters für open()here.

So würden Sie Ihren offenen Aufruf ändern -

outputFile = open("./outputFile.txt", "a", 0) 
+2

Danke, die zweite Option ist die beste für mich, weil ich nicht jedes Mal outputFile.flush() schreiben will, aber beide arbeiten. – elbajo

+1

Anstatt die Datei während zeitintensiver Operationen offen zu lassen, könnte es sich lohnen, die with-Anweisung zu betrachten, die dasselbe erreichen würde. – nachshon

+1

@nachshon "das gleiche erreichen": nicht für mich auf meinem System (RHEL 6.8 mit [conda] (https://en.wikipedia.org/wiki/Conda_ (package_manager)) -basierten Python 2.7.13). Der 'os.fsync()' Aufruf, der in [ffeast] (https://stackoverflow.com/a/41506739/257924) erwähnt wird, wird benötigt (kann nicht sicher für Microsoft Windows-basiertes Python oder andere Betriebssysteme sagen). – bgoodr

14

Kraft mit der flush() Funktion, fügen Sie

outputFile.flush() 

am Ende des Codes.

+2

Wenn dieser Code hinzugefügt am Am Ende der Python-Datei wird nichts erreicht, was beim Schließen der Datei ohnehin nicht der Fall gewesen wäre. Stattdessen sollte es möglicherweise mehrmals ausgeführt werden - wann immer es gewünscht ist, sicherzustellen, dass die gesamte ausgegebene Ausgabe in die Datei geschrieben wurde. – martineau

3

Wie @RyPeck gesagt, Sie flush() oder stellen Sie das Dateiobjekt seine ungepufferte verwenden können. Aber beachten Sie die folgenden Punkte (von https://docs.python.org/2/library/stdtypes.html?highlight=file%20flush#file.flush):

den internen Puffer Flush, wie Fflush des stdio().

Hinweis flush() schreibt nicht unbedingt die Daten der Datei auf die Festplatte. Verwenden Sie flush() gefolgt von os.fsync(), um dieses Verhalten sicherzustellen.

und ein Zitat von man 3 fflush:

Beachten Sie, dass fflush() leert nur die User-Space-Puffer, die von der C-Bibliothek zur Verfügung gestellt. Um sicherzustellen, dass die Daten physisch auf dem Datenträger gespeichert werden, müssen die Kernel-Puffer ebenfalls gelöscht werden, z. B. mit sync (2) oder fsync (2).

+0

Aufruf os.fsync() hält meinen Code sofort –

+0

@Nam 'os.fsync()' funktioniert perfekt auf meinem System (RHEL 6.8 mit [conda] (https://en.wikipedia.org/wiki/Conda_ (package_manager)) - basierte Python 2.7.13). Sind Sie sicher, dass Sie keine Dateisystemprobleme oder ein überlastetes System haben? – bgoodr

+0

Ich habe keine Ahnung. Ich bin auf Ubuntu Desktop 16 und Python 2.7 –

0

nur alle oben genannten Antworten in eine Reihe von nützlichen Hilfsfunktionen zu kombinieren, da eine wesentliche Voraussetzung des OP (und mich!) Ist „because I don't want to write outputFile.flush() each time“:

import os 
import tempfile 
import time 


def write_now(filep, msg): 
    """Write msg to the file given by filep, forcing the msg to be written to the filesystem immediately (now). 

    Without this, if you write to files, and then execute programs 
    that should read them, the files will not show up in the program 
    on disk. 
    """ 
    filep.write(msg) 
    filep.flush() 
    # The above call to flush is not enough to write it to disk *now*; 
    # according to https://stackoverflow.com/a/41506739/257924 we must 
    # also call fsync: 
    os.fsync(filep) 


def print_now(filep, msg): 
    """Call write_now with msg plus a newline.""" 
    write_now(filep, msg + '\n') 


# Example use with the with..as statement: 
with tempfile.NamedTemporaryFile(prefix='some_prefix_here.', suffix='.log', dir='.', delete=False) as logf: 
    print_now(logf, "this is a test1") 
    time.sleep(20) 
    print_now(logf, "this is a test2")