HOWTO · Python
Rediriger la sortie d'impression vers un fichier en Python
Ce tutoriel montre comment rediriger la sortie d'impression vers un fichier en Python
Sur cette page
Pour enregistrer du texte dans un fichier en Python, ouvrez-le avec open() et écrivez dans l’objet fichier renvoyé. Utilisez le mode "w" pour créer ou remplacer un fichier, ou "a" pour ajouter du contenu à la fin. Une instruction with ferme le fichier à la fin du bloc.
Cet exemple écrit un message dans report.txt, puis affiche le texte enregistré :
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
Les exemples ci-dessous montrent quand utiliser write(), print(), la redirection de la sortie standard, writelines() ou l’interface de chemins de pathlib. La plupart des exemples utilisent une instruction with pour fermer automatiquement le fichier ; l’exemple avec sys.stdout rétablit le flux précédent et ferme explicitement son fichier.
Écrire du texte avec open() et write()
open() détermine comment un fichier est ouvert ; write() est une méthode de l’objet fichier qu’il renvoie. Le mode "w" crée un fichier ou remplace son contenu existant. Le mode "a" crée le fichier s’il n’existe pas et ajoute du texte à la fin. Ce sont des modes d’ouverture du fichier, pas des opérations de write().
write() accepte une chaîne de caractères et n’ajoute pas de saut de ligne. Insérez \n là où vous voulez commencer une nouvelle ligne. La valeur renvoyée indique le nombre de caractères écrits.
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
Pour ajouter du contenu, remplacez le mode par "a". Par exemple, with open("notes.txt", "a", encoding="utf-8") as file: file.write("Next entry\n") ajoute une ligne après le contenu existant. Sauf si vous indiquez un autre chemin, celui-ci est résolu par rapport au répertoire de travail courant du programme.
Écrire dans un fichier avec print()
Utilisez print(..., file=file_object) si vous souhaitez conserver le comportement de mise en forme habituel de print() tout en envoyant sa sortie dans un fichier. Cette fonction convertit les objets en texte, sépare les valeurs multiples par une espace par défaut et ajoute un saut de ligne par défaut. sep et end permettent de modifier ces paramètres.
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
Le bloc with ferme le fichier une fois l’écriture terminée. Il n’est pas nécessaire d’appeler close() dans ce bloc : Python ferme le fichier à la sortie du bloc.
Rediriger la sortie standard avec sys.stdout
sys.stdout est le flux utilisé par print() lorsqu’aucun argument file n’est fourni. Affecter un fichier à sys.stdout redirige la sortie standard du processus ; il faut donc sauvegarder puis rétablir le flux précédent et fermer le fichier. Pour une redirection courante et limitée à un bloc, préférez contextlib.redirect_stdout() dans la section suivante. Consultez la référence de sys.stdout (disponible uniquement en anglais ; aucune cible française n’est disponible).
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
Rétablir le flux d’origine dans finally garantit que les sorties suivantes reviennent à leur destination précédente, même si le code du bloc redirigé échoue. Le with externe gère le répertoire temporaire ; le fichier lui-même est fermé explicitement après le rétablissement de sys.stdout.
Rediriger temporairement la sortie avec contextlib.redirect_stdout()
contextlib.redirect_stdout() dirige temporairement sys.stdout vers un objet de type fichier à l’intérieur d’un bloc with. À la fin du bloc, le flux de sortie standard précédent est rétabli. Le fichier reste géré par sa propre instruction 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
Cette approche capture les appels à print() et les autres écritures vers la sortie standard effectués dans le contexte. Elle ne redirige pas la sortie d’erreur standard (sys.stderr).
Écrire une séquence avec writelines()
writelines() écrit dans le fichier, dans l’ordre, chaque chaîne d’un objet itérable. Cette méthode n’insère pas de sauts de ligne : ajoutez \n aux chaînes si vous voulez que le fichier contienne des lignes distinctes.
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
Pour un fichier texte, les éléments doivent être des chaînes de caractères. Si vous ne voulez pas de sauts de ligne, omettez \n dans chaque chaîne.
Ouvrir et écrire dans des fichiers avec pathlib
pathlib fournit des objets permettant de construire et de manipuler des chemins de système de fichiers. Il ne remplace pas les objets fichier : utilisez Path.open() pour en obtenir un, puis appelez sa méthode write(). Cette approche est pratique lorsque le chemin est composé de dossiers ou d’autres éléments.
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.
Utilisez Path.write_text() pour écrire du texte en une seule étape lorsque vous n’avez pas besoin de gérer directement un objet fichier. Pour effectuer plusieurs écritures ou utiliser des méthodes comme writelines(), Path.open() vous fournit l’objet fichier nécessaire.
Pour la tâche inverse, consultez comment lire un fichier dans une chaîne en Python.