W3docs

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 objet pathlib.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

ModeSignificationCrée le fichier ?Tronque le fichier existant ?
"r"Lecture (défaut)NonNon
"w"ÉcritureOuiOui
"a"AjoutOuiNon
"x"Création exclusiveÉchoue si le fichier existe
"r+"Lecture et écritureNonNon
"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 here

Appeler 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 lines

Utilisez 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, 1 depuis la position courante, 2 depuis 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)  # True

seek() 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 :

ExceptionQuand elle se produit
FileNotFoundErrorLecture d'un fichier qui n'existe pas
FileExistsErrorCréation d'un fichier avec le mode "x" alors qu'il existe déjà
PermissionErrorDroits de lecture/écriture insuffisants
IsADirectoryErrorTentative d'ouvrir un répertoire comme un fichier
UnicodeDecodeErrorLes 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érationApproche os / shutilApproche pathlib
Ouvrir et lireopen(path, "r")Path(path).read_text()
Ouvrir et écrireopen(path, "w")Path(path).write_text()
Vérifier l'existenceos.path.exists(path)Path(path).exists()
Renommeros.rename(src, dst)Path(src).rename(dst)
Déplacershutil.move(src, dst)Path(src).rename(dst) (même FS)
Supprimeros.remove(path)Path(path).unlink()

Chapitres associés

Was this page helpful?