Leiten der Druckausgabe in eine TXT-Datei

75

Gibt es eine Möglichkeit, die gesamte Druckausgabe in einer txt-Datei in Python zu speichern? Nehmen wir an, ich habe diese beiden Zeilen in meinem Code und möchte die Druckausgabe in einer Datei mit dem Namen speichern output.txt.

print ("Hello stackoverflow!")
print ("I have a question.")

Ich möchte, dass die output.txtDatei enthält

Hello stackoverflow!
I have a question.
Klon
quelle

Antworten:

132

Geben Sie printein fileSchlüsselwortargument an, wobei der Wert des Arguments ein Dateistream ist. Wir können einen Dateistream mit der openFunktion erstellen :

print("Hello stackoverflow!", file=open("output.txt", "a"))
print("I have a question.", file=open("output.txt", "a"))

Aus der Python-Dokumentation zuprint :

Das fileArgument muss ein Objekt mit einer write(string)Methode sein. wenn es nicht vorhanden oder ist None, sys.stdoutwird verwendet.

Und die Dokumentation füropen :

Öffnen Sie fileein entsprechendes Dateiobjekt und geben Sie es zurück. Wenn die Datei nicht geöffnet werden kann, wird eine OSErrorausgelöst.

Das " a "als zweites Argument openbedeutet "anhängen" - mit anderen Worten, der vorhandene Inhalt der Datei wird nicht überschrieben. Wenn Sie möchten, dass die Datei stattdessen überschrieben wird, verwenden Sie "w".


Das mehrmalige Öffnen einer Datei openist jedoch nicht ideal für die Leistung. Sie sollten es idealerweise einmal öffnen und benennen und diese Variable dann an printdie fileOption übergeben. Sie müssen daran denken, die Datei danach zu schließen!

f = open("output.txt", "a")
print("Hello stackoverflow!", file=f)
print("I have a question.", file=f)
f.close()

Es gibt auch eine syntaktische Verknüpfung dafür, die der withBlock ist. Dadurch wird Ihre Datei am Ende des Blocks für Sie geschlossen:

with open("output.txt", "a") as f:
    print("Hello StackOverflow!", file=f)
    print("I have a question.", file=f)
Aaron Christiansen
quelle
Danke für diese Antwort. Sobald die erste Zeile des Codes (erster Druck) ausgeführt wurde, wird die entsprechende Datei geschlossen, bevor der zweite Druckbefehl tatsächlich ausgeführt wird. Recht? Gibt es eine Möglichkeit, viele Dinge zusammen in derselben Datei zu drucken, aber sicherzustellen, dass die Datei geschlossen wird, bevor die zweite Runde der Schleife ausgeführt wird? Mit anderen Worten, ich möchte für jede Runde um die Schleife einige Dinge in denselben Dateien drucken, wobei die Datei dazwischen geschlossen wird. Danke,
Ash
9
@Allan, Sie sollten eine withAnweisung verwenden, um die Datei zu öffnen. Dadurch wird ein fileObjekt erstellt, während des gesamten Blocks geöffnet und am Ende geschlossen. Schauen Sie sich das erste Beispiel in diesem Artikel an . Lassen Sie mich wissen, wenn Sie weitere Fragen haben!
Aaron Christiansen
Danke, das funktioniert schon sehr gut. Wie kann dies so geändert werden, dass es sowohl in der Datei als auch in der Konsole gedruckt wird? ohne die print-Anweisung nur einmal auszuwerten, damit zeitaufwändige Funktionen nur einmal ausgeführt werden?
Julian
@Julian Bitte überprüfen Sie die "print_both" -Funktion in dieser anderen Ausgabe stackoverflow.com/a/24206109/9492673 für den Druck sowohl auf der Konsole als auch in einer Ausgabedatei
Tommaso Di Noto
19

Sie können stdout in eine Datei "output.txt" umleiten:

import sys
sys.stdout = open('output.txt','wt')
print ("Hello stackoverflow!")
print ("I have a question.")
Roman Bronshtein
quelle
9
Gibt es eine Möglichkeit, dies zu tun UND auch den Text in der Konsole anzuzeigen? Also gleichzeitig auf Konsole und in eine Datei drucken? Ich möchte in der Lage sein, alle meine Fortschrittsdruckanweisungen zu sehen, damit ich weiß, wo sich das Programm in seiner Ausführung befindet, und die Anweisungen zur Fehlerbehebung, aber auch all diesen Speicherauszug in einer Textdatei.
Korzak
1
@Korzak Bitte überprüfen Sie die Funktion "print_both" in dieser anderen Ausgabe stackoverflow.com/a/24206109/9492673 für den Druck sowohl auf der Konsole als auch in einer Ausgabedatei
Tommaso Di Noto
6

Verwenden Sie das Protokollierungsmodul

def init_logging():
    rootLogger = logging.getLogger('my_logger')

    LOG_DIR = os.getcwd() + '/' + 'logs'
    if not os.path.exists(LOG_DIR):
        os.makedirs(LOG_DIR)
    fileHandler = logging.FileHandler("{0}/{1}.log".format(LOG_DIR, "g2"))
    rootLogger.addHandler(fileHandler)

    rootLogger.setLevel(logging.DEBUG)

    consoleHandler = logging.StreamHandler()
    rootLogger.addHandler(consoleHandler)

    return rootLogger

Holen Sie sich den Logger:

logger = init_logging()

Und starten Sie die Protokollierung / Ausgabe (ing):

logger.debug('Hi! :)')
gies0r
quelle
1

Eine andere Variante kann sein ... Schließen Sie die Datei anschließend unbedingt

import sys
file = open('output.txt', 'a')
sys.stdout = file

print("Hello stackoverflow!") 
print("I have a question.")

file.close()
vic
quelle
1

Eine andere Methode, ohne Ihren Python-Code aktualisieren zu müssen, wäre die Umleitung über die Konsole .

Grundsätzlich sollten Sie Ihr Python-Skript print()wie gewohnt verwenden, dann das Skript über die Befehlszeile aufrufen und die Befehlszeilenumleitung verwenden. So was:

$ python ./myscript.py > output.txt

Ihre output.txtDatei enthält jetzt alle Ausgaben Ihres Python-Skripts.

Bearbeiten:
Um den Kommentar zu adressieren; Ändern Sie unter Windows den Schrägstrich in einen umgekehrten Schrägstrich.
(dh .\myscript.py)

S3DEV
quelle
Dies ist nur Linux. Während ich Linux liebe, verwenden manche Leute nur Windoze - und damit bin ich vollkommen einverstanden, solange es mich nicht betrifft.
TheTechRobo36414519
0

Angenommen, meine Eingabedatei ist "input.txt" und die Ausgabedatei ist "output.txt".

Angenommen, die Eingabedatei enthält Details zum Lesen:

5
1 2 3 4 5

Code:

import sys

sys.stdin = open("input", "r")
sys.stdout = open("output", "w")

print("Reading from input File : ")
n = int(input())
print("Value of n is :", n)

arr = list(map(int, input().split()))
print(arr)

Dies wird also aus der Eingabedatei gelesen und die Ausgabe wird in der Ausgabedatei angezeigt.

Weitere Informationen finden Sie unter https://www.geeksforgeeks.org/inputoutput-external-file-cc-java-python-competitive-programming/

Chandra Shekhar
quelle
-3

Man kann die zurückgegebene Ausgabe einer Funktion direkt in einer Datei speichern.

print(output statement, file=open("filename", "a"))
Asiis Pradhan
quelle
1
Was haben Sie anders beantwortet als die akzeptierte Antwort bereits? Außerdem funktioniert Ihr Code nicht einmal. Falsche Anführungszeichen ..
sertsedat