Gestion des fichiers en Python : guide complet
Apprenez la gestion des fichiers Python : modes d'ouverture, lecture, écriture, pathlib, gestion des erreurs et positions dans les fichiers.
La gestion des fichiers permet à vos programmes de stocker des données de manière permanente et de les récupérer ultérieurement. Ce chapitre explique toutes les opérations courantes sur les fichiers en Python : ouverture dans différents modes, lecture et écriture de données, navigation dans un fichier, spécification de l'encodage des caractères et gestion des erreurs rencontrées dans le code réel.
La fonction open()
Toute opération sur les fichiers en Python commence par open(). Elle retourne un objet fichier qui expose des méthodes pour lire, écrire et se positionner dans le fichier.
file_object = open(file, mode="r", encoding=None)file— le chemin vers le fichier (une string ou un objetpathlib.Path).mode— la façon d'ouvrir le fichier (voir le tableau ci-dessous).encoding— l'encodage du texte, par exemple"utf-8". Spécifiez-le toujours pour les fichiers texte afin que votre code fonctionne de la même façon sur tous les systèmes d'exploitation.
Modes d'ouverture
| Mode | Signification | Crée le fichier ? | Tronque le fichier existant ? |
|---|---|---|---|
"r" | Lecture (défaut) | Non | Non |
"w" | Écriture | Oui | Oui |
"a" | Ajout | Oui | Non |
"x" | Création exclusive | Échoue si le fichier existe | — |
"r+" | Lecture et écriture | Non | Non |
"b" | Binaire (à combiner avec ce qui précède, ex. "rb") | — | — |
"t" | Texte (défaut, à combiner avec ce qui précède, ex. "rt") | — | — |
Toujours utiliser with pour ouvrir les fichiers
L'instruction with (un gestionnaire de contexte) garantit que le fichier est fermé à la sortie du bloc — même si une exception est levée. Cela évite les fuites de ressources et s'assure que les écritures en tampon sont vidées sur le disque.
Ouvrir un fichier en toute sécurité avec with
with open("notes.txt", "r", encoding="utf-8") as f:
contents = f.read()
# File is automatically closed hereAppeler open() sans with et oublier file.close() est une source fréquente de corruption de données et d'erreurs « trop de fichiers ouverts » dans les programmes de longue durée.
Lecture des fichiers
Python propose plusieurs façons de lire le contenu d'un fichier.
Lire le fichier entier avec read()
read() retourne l'intégralité du contenu du fichier sous forme d'une seule string.
Lire un fichier entier
with open("notes.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)Pour les fichiers volumineux, tout le contenu est chargé en mémoire d'un coup, ce qui convient pour les petits fichiers mais est inefficace pour des journaux de plusieurs gigaoctets.
Lire un nombre fixe de caractères
Passez un entier à read(n) pour lire au plus n caractères.
Lire les 20 premiers caractères
with open("notes.txt", "r", encoding="utf-8") as f:
chunk = f.read(20)
print(repr(chunk))Lire ligne par ligne avec readline()
readline() retourne la ligne suivante avec son \n final, ou une string vide en fin de fichier.
Lire un fichier ligne par ligne avec readline()
with open("notes.txt", "r", encoding="utf-8") as f:
line = f.readline()
while line:
print(line, end="") # line already contains '\n'
line = f.readline()Itérer sur les lignes (la façon la plus pythonique)
Itérer directement sur un objet fichier est l'approche la plus économe en mémoire pour une lecture ligne par ligne.
Itérer sur les lignes
with open("notes.txt", "r", encoding="utf-8") as f:
for line in f:
print(line, end="")Lire toutes les lignes dans une liste avec readlines()
readlines() retourne une liste dont chaque élément est une ligne (caractère de retour à la ligne inclus).
Lire toutes les lignes dans une liste
with open("notes.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(lines[0]) # first line
print(len(lines)) # total number of linesUtilisez readlines() lorsque vous avez besoin d'un accès aléatoire à des lignes spécifiques par index. Pour un traitement séquentiel, préférez le schéma for line in f.
Écriture dans les fichiers
Mode écriture ("w")
Le mode écriture crée le fichier s'il n'existe pas et le tronque (le vide) s'il existe déjà.
Écrire du texte dans un fichier
with open("output.txt", "w", encoding="utf-8") as f:
f.write("Line one\n")
f.write("Line two\n")Écrire plusieurs lignes avec writelines()
writelines() accepte un itérable de strings. Il n'ajoute pas automatiquement de caractères de retour à la ligne.
Écrire une liste de lignes
lines = ["apple\n", "banana\n", "cherry\n"]
with open("fruits.txt", "w", encoding="utf-8") as f:
f.writelines(lines)Mode ajout ("a")
Le mode ajout déplace la position d'écriture à la fin du fichier avant chaque écriture, de sorte que le contenu existant n'est jamais écrasé.
Ajouter une entrée de journal
import datetime
entry = f"{datetime.date.today()} — task complete\n"
with open("log.txt", "a", encoding="utf-8") as f:
f.write(entry)À chaque exécution de ce script, une nouvelle ligne est ajoutée à log.txt sans toucher aux entrées précédentes.
Mode création exclusive ("x")
Utilisez "x" lorsque vous souhaitez créer un nouveau fichier et garantir que vous n'écrasez pas un fichier existant. Python lève FileExistsError si le fichier existe déjà.
Créer un fichier uniquement s'il n'existe pas
try:
with open("config.txt", "x", encoding="utf-8") as f:
f.write("[settings]\n")
except FileExistsError:
print("config.txt already exists — not overwriting.")Positions dans le fichier : seek() et tell()
Les objets fichier maintiennent un pointeur de position interne qui avance au fur et à mesure que vous lisez ou écrivez. Vous pouvez inspecter et modifier ce pointeur.
tell()— retourne la position courante en octets.seek(offset, whence=0)— déplace le pointeur.whence=0(défaut) est depuis le début,1depuis la position courante,2depuis la fin.
Revenir au début avec seek(0)
with open("notes.txt", "r", encoding="utf-8") as f:
first_pass = f.read()
f.seek(0) # go back to the start
second_pass = f.read()
print(first_pass == second_pass) # Trueseek() est particulièrement utile en mode "r+" (lecture-écriture) où vous pouvez lire une section puis l'écraser dans le même appel ouvert.
Travailler avec les fichiers binaires
Ouvrez un fichier en mode binaire en ajoutant "b" à la chaîne de mode ("rb", "wb", "ab"). Le mode binaire vous donne des octets bruts au lieu de strings, ce qui est essentiel pour les images, l'audio, les archives compressées et les autres données non textuelles.
Copier un fichier en mode binaire
with open("photo.jpg", "rb") as src:
data = src.read()
with open("photo_backup.jpg", "wb") as dst:
dst.write(data)Ne spécifiez pas encoding en mode binaire — Python lèvera une ValueError si vous essayez.
Gestion des erreurs
Les opérations sur les fichiers peuvent échouer de manière prévisible. Les entourer de blocs try/except rend vos scripts robustes.
Gérer les erreurs courantes sur les fichiers
try:
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
except FileNotFoundError:
print("Error: the file does not exist.")
except PermissionError:
print("Error: you do not have permission to read this file.")
except OSError as e:
print(f"OS error: {e}")Exceptions courantes que vous rencontrerez :
| Exception | Quand elle se produit |
|---|---|
FileNotFoundError | Lecture d'un fichier qui n'existe pas |
FileExistsError | Création d'un fichier avec le mode "x" alors qu'il existe déjà |
PermissionError | Droits de lecture/écriture insuffisants |
IsADirectoryError | Tentative d'ouvrir un répertoire comme un fichier |
UnicodeDecodeError | Les octets du fichier ne correspondent pas à l'encodage spécifié |
L'alternative moderne pathlib
Python 3.4 a introduit pathlib.Path, une approche orientée objet des chemins de système de fichiers. Les objets Path fonctionnent parfaitement avec open() et exposent également leurs propres méthodes pratiques read_text() / write_text().
Lire un fichier avec pathlib
from pathlib import Path
content = Path("notes.txt").read_text(encoding="utf-8")
print(content)Écrire un fichier avec pathlib
from pathlib import Path
Path("output.txt").write_text("Hello, world!\n", encoding="utf-8")read_text() et write_text() ouvrent et ferment le fichier pour vous, rendant les lectures et écritures ponctuelles très concises. Utilisez open() avec un bloc with lorsque vous avez besoin d'un contrôle plus fin — par exemple, lire un fichier par morceaux ou utiliser seek().
Renommer et déplacer des fichiers
Pour renommer ou déplacer un fichier, utilisez os.rename() pour un renommage sur le même système de fichiers, ou shutil.move() lorsque vous devez déplacer vers un autre système de fichiers.
Renommer un fichier avec os.rename()
import os
os.rename("old_name.txt", "new_name.txt")Déplacer un fichier avec shutil.move()
import shutil
shutil.move("report.txt", "archive/report.txt")shutil.move() fonctionne même lorsque la source et la destination sont sur des lecteurs différents ; os.rename() lève une OSError dans ce cas.
Vérifier si un fichier existe
Avant d'ouvrir un fichier en lecture, vous pouvez vouloir confirmer qu'il existe. Utilisez os.path.exists() ou l'équivalent pathlib.
Vérifier l'existence avec os.path
import os
if os.path.exists("data.txt"):
print("File found.")
else:
print("File not found.")Vérifier l'existence avec pathlib
from pathlib import Path
p = Path("data.txt")
if p.exists():
print("File found.")Notez que os.path.exists() et Path.exists() peuvent retourner des résultats obsolètes dans les programmes multi-threadés ou multi-processus. Dans ces cas, préférez simplement open() le fichier et intercepter FileNotFoundError.
Récapitulatif des fonctions clés
| Opération | Approche os / shutil | Approche pathlib |
|---|---|---|
| Ouvrir et lire | open(path, "r") | Path(path).read_text() |
| Ouvrir et écrire | open(path, "w") | Path(path).write_text() |
| Vérifier l'existence | os.path.exists(path) | Path(path).exists() |
| Renommer | os.rename(src, dst) | Path(src).rename(dst) |
| Déplacer | shutil.move(src, dst) | Path(src).rename(dst) (même FS) |
| Supprimer | os.remove(path) | Path(path).unlink() |
Chapitres associés
- Lire des fichiers Python — exploration approfondie de toutes les techniques de lecture
- Écrire / créer des fichiers Python — écriture, création et bonnes pratiques
- Supprimer des fichiers Python — suppression de fichiers et de répertoires en toute sécurité
- Python Try Except — gestion des exceptions en Python
- L'instruction With de Python — fonctionnement des gestionnaires de contexte