Skip to content

La Gestion des Fichiers en Python

La gestion des fichiers est une compétence fondamentale en programmation. Elle permet de lire, écrire et manipuler des données stockées sur le disque dur, ce qui est essentiel pour créer des applications qui persistent les informations au-delà de l’exécution du programme.

Python offre des outils puissants et intuitifs pour travailler avec différents types de fichiers : texte simple, CSV, JSON, et même des fichiers binaires comme les images. La maîtrise de ces techniques vous permettra de créer des applications qui interagissent avec des données réelles.

Pourquoi apprendre la gestion des fichiers ?

  • Sauvegarder et charger des configurations d’application
  • Traiter de grandes quantités de données
  • Échanger des informations entre programmes
  • Créer des logs et des rapports
  • Manipuler des fichiers de différents formats (CSV, JSON, etc.)

Dans ce cours, vous apprendrez toutes les techniques essentielles pour devenir autonome dans la manipulation de fichiers avec Python.


La fonction open() est le point d’entrée pour travailler avec des fichiers en Python.

# Ouvrir un fichier en lecture
fichier = open('document.txt', 'r')
# ... opérations sur le fichier
fichier.close()
# Ouvrir un fichier en écriture
fichier = open('document.txt', 'w')
# ... opérations d'écriture
fichier.close()

Syntaxe : open(nom_fichier, mode)

  • nom_fichier : Chemin du fichier (absolu ou relatif)
  • mode : Mode d’ouverture (lecture, écriture, etc.)

⚠️ Attention : Toujours fermer un fichier avec close() pour libérer les ressources système.

# ❌ Risque de fuite de ressources
fichier = open('data.txt', 'r')
contenu = fichier.read()
# Oubli du close() - problématique !
# ✅ Bonne pratique
fichier = open('data.txt', 'r')
contenu = fichier.read()
fichier.close() # Libération explicite

Conséquences d’un fichier non fermé :

  • Consommation inutile de mémoire
  • Verrouillage du fichier pour d’autres programmes
  • Perte potentielle de données non écrites

ModeDescriptionComportement si fichier existeComportement si fichier n’existe pas
'r'Lecture seuleOuvre le fichierErreur FileNotFoundError
'w'ÉcritureÉcrase le contenuCrée le fichier
'a'Ajout (append)Ajoute à la finCrée le fichier
'x'Création exclusiveErreur FileExistsErrorCrée le fichier
'r+'Lecture + ÉcritureOuvre sans écraserErreur FileNotFoundError
'w+'Écriture + LectureÉcrase le contenuCrée le fichier

Ajoutez 'b' pour travailler avec des fichiers binaires (images, vidéos, PDF, etc.).

# Lire une image
fichier = open('photo.png', 'rb')
contenu_binaire = fichier.read()
fichier.close()
# Copier une image
with open('source.jpg', 'rb') as source:
with open('copie.jpg', 'wb') as destination:
destination.write(source.read())

Résultat : Le fichier copie.jpg est une copie exacte de source.jpg.

💡 Astuce : Utilisez toujours le mode binaire ('rb', 'wb') pour les fichiers non textuels.


3.1 Méthode read() - Lire tout le contenu

Section titled “3.1 Méthode read() - Lire tout le contenu”
fichier = open('document.txt', 'r')
contenu = fichier.read()
print(contenu)
fichier.close()

Résultat attendu :

[Tout le contenu du fichier affiché]

⚠️ Attention : read() charge tout le fichier en mémoire. Évitez-le pour les très gros fichiers.

3.2 Méthode readline() - Lire ligne par ligne

Section titled “3.2 Méthode readline() - Lire ligne par ligne”
fichier = open('document.txt', 'r')
ligne = fichier.readline()
while ligne:
print(ligne.strip()) # strip() enlève le \n
ligne = fichier.readline()
fichier.close()

Résultat attendu :

Ligne 1 du fichier
Ligne 2 du fichier
Ligne 3 du fichier

3.3 Méthode readlines() - Lire toutes les lignes

Section titled “3.3 Méthode readlines() - Lire toutes les lignes”
fichier = open('document.txt', 'r')
lignes = fichier.readlines()
fichier.close()
# lignes est une liste
for ligne in lignes:
print(ligne.strip())

Résultat attendu :

['Ligne 1\n', 'Ligne 2\n', 'Ligne 3\n']

3.4 Itération directe (méthode recommandée)

Section titled “3.4 Itération directe (méthode recommandée)”
fichier = open('document.txt', 'r')
# Itérer directement sur le fichier
for ligne in fichier:
print(ligne.strip())
fichier.close()

💡 Astuce : Cette méthode est la plus efficace en mémoire car elle lit ligne par ligne sans tout charger.


fichier = open('output.txt', 'w')
fichier.write('Première ligne\n')
fichier.write('Deuxième ligne\n')
fichier.close()

Résultat dans output.txt :

Première ligne
Deuxième ligne

⚠️ Attention : Le mode 'w' écrase le contenu existant du fichier !

4.2 Méthode writelines() - Écrire plusieurs lignes

Section titled “4.2 Méthode writelines() - Écrire plusieurs lignes”
lignes = ['Ligne 1\n', 'Ligne 2\n', 'Ligne 3\n']
fichier = open('output.txt', 'w')
fichier.writelines(lignes)
fichier.close()

Résultat dans output.txt :

Ligne 1
Ligne 2
Ligne 3

Note : writelines() n’ajoute pas automatiquement de \n, pensez à l’inclure.

4.3 Mode ajout (append) - Ajouter sans écraser

Section titled “4.3 Mode ajout (append) - Ajouter sans écraser”
# Contenu existant dans fichier.txt : "Ligne existante\n"
fichier = open('fichier.txt', 'a')
fichier.write('Nouvelle ligne ajoutée\n')
fichier.close()

Résultat dans fichier.txt :

Ligne existante
Nouvelle ligne ajoutée

5. Utiliser le bloc with (gestionnaire de contexte)

Section titled “5. Utiliser le bloc with (gestionnaire de contexte)”

Le bloc with garantit que le fichier sera toujours fermé, même en cas d’erreur.

# ❌ Risqué - Si erreur, fichier non fermé
fichier = open('data.txt', 'r')
contenu = fichier.read()
# Si erreur ici, close() n'est jamais appelé
fichier.close()
# ✅ Sécurisé - Fermeture automatique garantie
with open('data.txt', 'r') as fichier:
contenu = fichier.read()
# fichier automatiquement fermé ici, même en cas d'erreur
# Lecture avec with
with open('document.txt', 'r') as fichier:
for ligne in fichier:
print(ligne.strip())
# Écriture avec with
with open('output.txt', 'w') as fichier:
fichier.write('Contenu écrit avec with\n')

Résultat attendu :

[Lignes du document affichées]

5.3 Ouvrir plusieurs fichiers simultanément

Section titled “5.3 Ouvrir plusieurs fichiers simultanément”
# Copier un fichier ligne par ligne
with open('source.txt', 'r') as source, open('destination.txt', 'w') as dest:
for ligne in source:
dest.write(ligne)

💡 Bonne pratique : Utilisez toujours with pour la gestion de fichiers.


import csv
# Données à écrire
donnees = [
['Nom', 'Age', 'Ville'],
['Alice', '30', 'Paris'],
['Bob', '25', 'Lyon'],
['Charlie', '35', 'Marseille']
]
# Écriture dans le CSV
with open('personnes.csv', 'w', newline='', encoding='utf-8') as fichier_csv:
writer = csv.writer(fichier_csv)
writer.writerows(donnees) # Écrire toutes les lignes

Résultat dans personnes.csv :

Nom,Age,Ville
Alice,30,Paris
Bob,25,Lyon
Charlie,35,Marseille

Points clés :

  • newline='' : Évite les lignes vides supplémentaires sur Windows
  • encoding='utf-8' : Support des caractères accentués
  • writerows() : Écrit plusieurs lignes d’un coup
import csv
with open('personnes.csv', 'r', encoding='utf-8') as fichier_csv:
lecteur = csv.reader(fichier_csv)
# Lire et afficher chaque ligne
for ligne in lecteur:
print(ligne)

Résultat attendu :

['Nom', 'Age', 'Ville']
['Alice', '30', 'Paris']
['Bob', '25', 'Lyon']
['Charlie', '35', 'Marseille']

6.3 Travailler avec des dictionnaires (DictReader/DictWriter)

Section titled “6.3 Travailler avec des dictionnaires (DictReader/DictWriter)”
import csv
# Lire avec DictReader (plus pratique)
with open('personnes.csv', 'r', encoding='utf-8') as fichier_csv:
lecteur = csv.DictReader(fichier_csv)
for personne in lecteur:
print(f"{personne['Nom']} a {personne['Age']} ans")

Résultat attendu :

Alice a 30 ans
Bob a 25 ans
Charlie a 35 ans

import json
# Données Python
donnees = {
'nom': 'Alice',
'age': 30,
'ville': 'Paris',
'competences': ['Python', 'JavaScript', 'SQL']
}
# Sauvegarder en JSON
with open('profil.json', 'w', encoding='utf-8') as fichier_json:
json.dump(donnees, fichier_json, indent=4, ensure_ascii=False)

Résultat dans profil.json :

{
"nom": "Alice",
"age": 30,
"ville": "Paris",
"competences": [
"Python",
"JavaScript",
"SQL"
]
}

Paramètres utiles :

  • indent=4 : Formatage lisible avec indentation
  • ensure_ascii=False : Préserve les caractères accentués
import json
with open('profil.json', 'r', encoding='utf-8') as fichier_json:
donnees = json.load(fichier_json)
print(f"Nom : {donnees['nom']}")
print(f"Compétences : {', '.join(donnees['competences'])}")

Résultat attendu :

Nom : Alice
Compétences : Python, JavaScript, SQL
import json
# Python → JSON (chaîne)
donnees_python = {'nom': 'Bob', 'age': 25}
json_string = json.dumps(donnees_python)
print(json_string) # {"nom": "Bob", "age": 25}
# JSON (chaîne) → Python
json_string = '{"nom": "Charlie", "age": 35}'
donnees_python = json.loads(json_string)
print(donnees_python['nom']) # Charlie

8. Gestion des exceptions liées aux fichiers

Section titled “8. Gestion des exceptions liées aux fichiers”
# FileNotFoundError - Fichier inexistant
try:
with open('inexistant.txt', 'r') as f:
contenu = f.read()
except FileNotFoundError:
print("❌ Erreur : Le fichier n'existe pas")
# PermissionError - Pas de droits d'accès
try:
with open('/root/protege.txt', 'w') as f:
f.write('test')
except PermissionError:
print("❌ Erreur : Permission refusée")
# IsADirectoryError - C'est un dossier, pas un fichier
try:
with open('/home/user/', 'r') as f:
contenu = f.read()
except IsADirectoryError:
print("❌ Erreur : C'est un répertoire, pas un fichier")

8.2 Gestion robuste avec try-except-finally

Section titled “8.2 Gestion robuste avec try-except-finally”
fichier = None
try:
fichier = open('data.txt', 'r')
contenu = fichier.read()
print(contenu)
except FileNotFoundError:
print("Fichier introuvable")
except PermissionError:
print("Permission refusée")
except Exception as e:
print(f"Erreur inattendue : {e}")
finally:
# Exécuté dans tous les cas
if fichier:
fichier.close()
print("Fichier fermé proprement")

💡 Astuce : Avec with, le bloc finally est souvent inutile car la fermeture est automatique.

8.3 Vérifier l’existence d’un fichier

Section titled “8.3 Vérifier l’existence d’un fichier”
import os
# Vérifier avant d'ouvrir
if os.path.exists('document.txt'):
with open('document.txt', 'r') as f:
contenu = f.read()
else:
print("Le fichier n'existe pas")
# Vérifier si c'est un fichier (pas un dossier)
if os.path.isfile('document.txt'):
print("C'est bien un fichier")

1. Toujours utiliser with pour gérer les fichiers

# ✅ Bon - Fermeture automatique
with open('file.txt', 'r') as f:
contenu = f.read()
# ❌ Mauvais - Risque de fuite de ressources
f = open('file.txt', 'r')
contenu = f.read()
f.close()

2. Spécifier l’encodage pour les fichiers texte

# ✅ Bon - Encodage explicite
with open('file.txt', 'r', encoding='utf-8') as f:
contenu = f.read()
# ❌ Risqué - Encodage par défaut peut varier
with open('file.txt', 'r') as f:
contenu = f.read()

3. Utiliser des chemins relatifs ou pathlib

from pathlib import Path
# ✅ Bon - Compatible multiplateforme
chemin = Path('dossier') / 'fichier.txt'
with open(chemin, 'r') as f:
contenu = f.read()
# ❌ Moins bon - Chemins en dur
with open('C:\\Users\\Documents\\file.txt', 'r') as f:
contenu = f.read()

4. Gérer les exceptions de manière appropriée

# ✅ Bon - Gestion d'erreur ciblée
try:
with open('data.txt', 'r') as f:
donnees = f.read()
except FileNotFoundError:
print("Fichier manquant, création d'un nouveau")
donnees = ""

5. Utiliser le mode binaire pour les fichiers non textuels

# ✅ Bon - Mode binaire pour images
with open('photo.jpg', 'rb') as f:
image_data = f.read()
# ❌ Mauvais - Mode texte pour fichiers binaires
with open('photo.jpg', 'r') as f: # Erreur !
image_data = f.read()

1. Ne jamais oublier newline='' avec CSV sur Windows

# ❌ Mauvais - Lignes vides sur Windows
with open('data.csv', 'w') as f:
writer = csv.writer(f)
# ✅ Bon
with open('data.csv', 'w', newline='') as f:
writer = csv.writer(f)

2. Ne pas utiliser read() sur de très gros fichiers

# ❌ Mauvais - Charge tout en mémoire
with open('huge_file.txt', 'r') as f:
contenu = f.read() # Peut saturer la RAM !
# ✅ Bon - Lecture ligne par ligne
with open('huge_file.txt', 'r') as f:
for ligne in f:
process(ligne)

3. Ne pas mélanger modes texte et binaire

# ❌ Erreur - write() attend des bytes en mode 'wb'
with open('file.bin', 'wb') as f:
f.write("texte") # TypeError !
# ✅ Bon
with open('file.bin', 'wb') as f:
f.write(b"bytes") # Utiliser bytes

Quand utiliser chaque format ?

  • Texte simple (.txt) : Logs, notes, configuration simple
  • CSV : Données tabulaires, export Excel, datasets
  • JSON : Configuration, API, données structurées
  • Binaire : Images, vidéos, fichiers compilés

Quand utiliser with ?

  • ✅ Toujours (sauf cas très spécifiques)
  • Garantit la fermeture même en cas d’erreur
  • Code plus lisible et pythonique

Cette évaluation rapide (3 minutes) vous permet de vérifier votre compréhension de la gestion des fichiers en Python.

Instructions :

  • 🕒 Temps limité : 3 minutes
  • 🎯 Seuil de réussite : 80% (8/10)
  • 💡 Les réponses seront expliquées à la fin

À vous de jouer ! 🚀



Exercice 1 : Lecture et affichage

Énoncé : Créez un fichier notes.txt contenant 3 lignes de texte, puis écrivez un programme qui lit et affiche chaque ligne.

Exemple d’exécution :

# Créez d'abord notes.txt avec 3 lignes
# Puis lisez et affichez-le
Voir la solution
# Solution complète
# Étape 1 : Créer le fichier
with open('notes.txt', 'w', encoding='utf-8') as f:
f.write('Première note\n')
f.write('Deuxième note\n')
f.write('Troisième note\n')
# Étape 2 : Lire et afficher
with open('notes.txt', 'r', encoding='utf-8') as f:
for ligne in f:
print(ligne.strip())

Résultat attendu :

Première note
Deuxième note
Troisième note

Exercice 2 : Copie de fichier

Énoncé : Écrivez un programme qui copie le contenu d’un fichier source.txt vers destination.txt.

Exemple d’exécution :

# Copiez source.txt vers destination.txt
Voir la solution
# Solution complète
with open('source.txt', 'r', encoding='utf-8') as source:
with open('destination.txt', 'w', encoding='utf-8') as dest:
for ligne in source:
dest.write(ligne)
print("✓ Copie terminée")

Résultat attendu :

✓ Copie terminée

(Le fichier destination.txt contient maintenant le même contenu que source.txt)


Exercice 3 : Compteur de lignes et de mots

Énoncé : Créez un programme qui compte le nombre de lignes et de mots dans un fichier texte.

Exemple d’exécution :

# Analysez un fichier et affichez les statistiques
Voir la solution
# Solution complète
def analyser_fichier(nom_fichier):
try:
with open(nom_fichier, 'r', encoding='utf-8') as f:
lignes = f.readlines()
nb_lignes = len(lignes)
nb_mots = sum(len(ligne.split()) for ligne in lignes)
print(f"Nombre de lignes : {nb_lignes}")
print(f"Nombre de mots : {nb_mots}")
except FileNotFoundError:
print(f"❌ Le fichier {nom_fichier} n'existe pas")
# Test
analyser_fichier('document.txt')

Résultat attendu :

Nombre de lignes : 15
Nombre de mots : 127

Exercice 4 : Gestionnaire de contacts CSV

Énoncé : Créez un système qui sauvegarde une liste de contacts (nom, téléphone, email) dans un fichier CSV, puis les relit et les affiche.

Exemple d’exécution :

# Sauvegardez des contacts puis relisez-les
Voir la solution
# Solution complète
import csv
def sauvegarder_contacts(contacts, fichier='contacts.csv'):
"""Sauvegarde les contacts dans un CSV."""
with open(fichier, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Nom', 'Téléphone', 'Email']) # En-têtes
writer.writerows(contacts)
print(f"✓ {len(contacts)} contacts sauvegardés")
def lire_contacts(fichier='contacts.csv'):
"""Lit et affiche les contacts."""
try:
with open(fichier, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for contact in reader:
print(f"{contact['Nom']}: {contact['Téléphone']} - {contact['Email']}")
except FileNotFoundError:
print("❌ Aucun fichier de contacts trouvé")
# Test
contacts = [
['Alice Dupont', '0601020304', 'alice@email.com'],
['Bob Martin', '0605060708', 'bob@email.com'],
['Charlie Durand', '0609101112', 'charlie@email.com']
]
sauvegarder_contacts(contacts)
print("\nContacts enregistrés :")
lire_contacts()

Résultat attendu :

✓ 3 contacts sauvegardés
Exercice 5 : Système de configuration JSON

Énoncé : Créez une application qui gère les paramètres d’un utilisateur (thème, langue, notifications) dans un fichier JSON avec les fonctions :

  1. Sauvegarder la configuration
  2. Charger la configuration
  3. Modifier un paramètre
  4. Réinitialiser aux valeurs par défaut

Exemple d’exécution :

# Créez un gestionnaire de configuration complet

  1. Utilisez toujours with : Garantit la fermeture automatique des fichiers
  2. Spécifiez l’encodage : encoding='utf-8' pour éviter les problèmes
  3. Mode approprié : 'r' lecture, 'w' écriture (écrase), 'a' ajout, 'b' binaire
  4. Itération efficace : Préférez itérer directement sur le fichier plutôt que read()
  5. Gérez les exceptions : Anticipez FileNotFoundError et PermissionError

Modules Python avancés :

  • pathlib : Manipulation moderne des chemins de fichiers
  • os et shutil : Opérations sur fichiers et dossiers (copie, déplacement, suppression)
  • pickle : Sérialisation d’objets Python complexes
  • yaml : Alternative à JSON pour la configuration

Concepts avancés :

  • Fichiers mappés en mémoire (mmap) pour de très gros fichiers
  • Streaming de fichiers pour le traitement de données massives
  • Compression (gzip, zipfile) pour économiser de l’espace
  • Opérations asynchrones avec aiofiles

Continuez à pratiquer régulièrement ! 🐍✨



À propos de l'auteur

Riyad ODJOUADEExpert en cybersécurité & infrastructure

Je partage des guides techniques pratiques sur la cybersécurité, l'administration système et le développement web. Tous les contenus sont basés sur des expérimentations réelles.