HOWTO · Python

Reindirizza l'output di stampa su un file in Python

Questo tutorial mostra come reindirizzare l'output di stampa su un file in Python

In questa pagina

Per salvare testo in un file in Python, aprilo con open() e scrivi tramite l’oggetto file restituito. Usa la modalità "w" per creare o sostituire un file oppure "a" per aggiungere contenuto alla fine. Un’istruzione with chiude il file quando termina il blocco.

Questo esempio scrive un messaggio in report.txt e poi mostra il testo salvato:

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "report.txt"
    with path.open("w", encoding="utf-8") as file:
        file.write("Monthly report\nRevenue: 1200\n")
    print(f"Saved to {path.name}:")
    print(path.read_text(encoding="utf-8"), end="")
Saved to report.txt:
Monthly report
Revenue: 1200

Gli esempi seguenti mostrano quando usare write(), print(), il reindirizzamento dello standard output, writelines() o l’interfaccia ai percorsi di pathlib. La maggior parte degli esempi usa with per chiudere automaticamente il file; nell’esempio con sys.stdout, invece, il flusso precedente viene ripristinato e il file viene chiuso esplicitamente.

Scrivere testo con open() e write()

open() determina come aprire un file; write() è un metodo dell’oggetto file restituito. La modalità "w" crea un file o sostituisce il contenuto esistente. La modalità "a" crea il file se necessario e aggiunge testo alla fine. Si tratta di modalità di apertura del file, non di operazioni di write().

write() accetta una stringa e non aggiunge un’interruzione di riga. Includi \n nel punto in cui vuoi iniziare una nuova riga. Il valore restituito indica il numero di caratteri scritti.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "notes.txt"
    with path.open("w", encoding="utf-8") as file:
        file.write("First line\n")
        file.write("Second line\n")
    print(path.read_text(encoding="utf-8"), end="")
First line
Second line

Per aggiungere contenuto, cambia la modalità in "a". Per esempio, with open("notes.txt", "a", encoding="utf-8") as file: file.write("Next entry\n") aggiunge una riga dopo il contenuto esistente. Se non specifichi un altro percorso, il percorso viene risolto rispetto alla directory di lavoro corrente del programma.

Stampare in un file con print()

Usa print(..., file=file_object) quando vuoi mantenere il consueto comportamento di formattazione di print(), ma scrivere il risultato in un file. La funzione converte gli oggetti in testo, separa più valori con uno spazio per impostazione predefinita e aggiunge un’interruzione di riga. Puoi modificare queste scelte con sep ed end.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "summary.txt"
    with path.open("w", encoding="utf-8") as file:
        print("Count:", 3, file=file)
        print("Ready:", True, file=file)
    print(path.read_text(encoding="utf-8"), end="")
Count: 3
Ready: True

Il blocco with chiude il file al termine della stampa. Chiamare close() all’interno del blocco non è necessario: quando il blocco termina, Python chiude il file automaticamente.

Reindirizzare lo standard output con sys.stdout

sys.stdout è il flusso usato da print() quando non viene fornito l’argomento file. Assegnare un file a sys.stdout reindirizza lo standard output del processo: salva quindi il flusso precedente, ripristinalo e chiudi il file. Per un reindirizzamento circoscritto e di routine, preferisci contextlib.redirect_stdout() nella sezione successiva. Consulta il riferimento a sys.stdout, disponibile solo in inglese.

import sys
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "log.txt"
    previous_stdout = sys.stdout
    file = path.open("w", encoding="utf-8")
    try:
        sys.stdout = file
        print("Job complete")
    finally:
        sys.stdout = previous_stdout
        file.close()
    print(path.read_text(encoding="utf-8"), end="")
Job complete

Ripristinare il flusso originale in finally assicura che l’output successivo torni alla destinazione precedente, anche se il codice nel blocco reindirizzato genera un errore. L’istruzione with esterna gestisce la directory temporanea; il file viene chiuso esplicitamente dopo il ripristino di sys.stdout.

Reindirizzare temporaneamente l’output con contextlib.redirect_stdout()

contextlib.redirect_stdout() indirizza temporaneamente sys.stdout verso un oggetto simile a un file all’interno di un blocco with. Quando il blocco termina, il flusso dello standard output precedente viene ripristinato. Il file continua a essere gestito dalla propria istruzione with.

import contextlib
from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "output.txt"
    with path.open("w", encoding="utf-8") as file:
        with contextlib.redirect_stdout(file):
            print("Build finished")
    print(path.read_text(encoding="utf-8"), end="")
Build finished

Questo approccio acquisisce le chiamate a print() e le altre scritture sullo standard output eseguite all’interno del contesto. Non reindirizza lo standard error (sys.stderr).

Scrivere una sequenza con writelines()

writelines() scrive nel file, nell’ordine, ogni stringa di un iterabile. Non inserisce interruzioni di riga: se vuoi righe separate nel file, includi \n nelle stringhe.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "items.txt"
    lines = ["apples\n", "pears\n", "plums\n"]
    with path.open("w", encoding="utf-8") as file:
        file.writelines(lines)
    print(path.read_text(encoding="utf-8"), end="")
apples
pears
plums

In un file di testo, gli elementi devono essere stringhe. Se non vuoi interruzioni di riga, ometti \n da ogni stringa.

Aprire e scrivere file con pathlib

pathlib fornisce oggetti per creare e gestire percorsi del file system. Non sostituisce gli oggetti file: usa Path.open() per ottenerne uno, quindi chiama il suo metodo write(). È utile quando il percorso viene composto a partire da cartelle o da altri componenti.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "archive" / "entry.txt"
    path.parent.mkdir()
    with path.open("w", encoding="utf-8") as file:
        file.write("Stored with pathlib.\n")
    print(path.read_text(encoding="utf-8"), end="")
Stored with pathlib.

Usa Path.write_text() per scrivere testo in un solo passaggio, in modo conciso, quando non devi gestire direttamente un oggetto file. Per scritture ripetute o per metodi come writelines(), Path.open() fornisce l’oggetto file necessario.

Per l’operazione inversa, consulta come leggere un file in una stringa in Python.