La Gestion des Fichiers en Python
📂 La Gestion des Fichiers en Python
Section titled “📂 La Gestion des Fichiers en Python”Introduction
Section titled “Introduction”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.
1. Ouvrir et fermer des fichiers
Section titled “1. Ouvrir et fermer des fichiers”1.1 Syntaxe de base avec open()
Section titled “1.1 Syntaxe de base avec open()”La fonction open() est le point d’entrée pour travailler avec des fichiers en Python.
# Ouvrir un fichier en lecturefichier = open('document.txt', 'r')# ... opérations sur le fichierfichier.close()
# Ouvrir un fichier en écriturefichier = open('document.txt', 'w')# ... opérations d'écriturefichier.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.
1.2 Importance de la fermeture
Section titled “1.2 Importance de la fermeture”# ❌ Risque de fuite de ressourcesfichier = open('data.txt', 'r')contenu = fichier.read()# Oubli du close() - problématique !
# ✅ Bonne pratiquefichier = open('data.txt', 'r')contenu = fichier.read()fichier.close() # Libération expliciteConsé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
2. Modes d’ouverture des fichiers
Section titled “2. Modes d’ouverture des fichiers”2.1 Modes principaux
Section titled “2.1 Modes principaux”| Mode | Description | Comportement si fichier existe | Comportement si fichier n’existe pas |
|---|---|---|---|
'r' | Lecture seule | Ouvre le fichier | Erreur FileNotFoundError |
'w' | Écriture | Écrase le contenu | Crée le fichier |
'a' | Ajout (append) | Ajoute à la fin | Crée le fichier |
'x' | Création exclusive | Erreur FileExistsError | Crée le fichier |
'r+' | Lecture + Écriture | Ouvre sans écraser | Erreur FileNotFoundError |
'w+' | Écriture + Lecture | Écrase le contenu | Crée le fichier |
2.2 Modes binaires
Section titled “2.2 Modes binaires”Ajoutez 'b' pour travailler avec des fichiers binaires (images, vidéos, PDF, etc.).
# Lire une imagefichier = open('photo.png', 'rb')contenu_binaire = fichier.read()fichier.close()
# Copier une imagewith 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. Lire des fichiers
Section titled “3. Lire des fichiers”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 fichierLigne 2 du fichierLigne 3 du fichier3.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 listefor 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 fichierfor 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.
4. Écrire dans des fichiers
Section titled “4. Écrire dans des fichiers”4.1 Méthode write() - Écrire du texte
Section titled “4.1 Méthode write() - Écrire du texte”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 ligneDeuxiè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 1Ligne 2Ligne 3Note : 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 existanteNouvelle ligne ajoutée5. Utiliser le bloc with (gestionnaire de contexte)
Section titled “5. Utiliser le bloc with (gestionnaire de contexte)”5.1 Pourquoi utiliser with ?
Section titled “5.1 Pourquoi utiliser with ?”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 garantiewith open('data.txt', 'r') as fichier: contenu = fichier.read()# fichier automatiquement fermé ici, même en cas d'erreur5.2 Syntaxe et exemples
Section titled “5.2 Syntaxe et exemples”# Lecture avec withwith open('document.txt', 'r') as fichier: for ligne in fichier: print(ligne.strip())
# Écriture avec withwith 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 lignewith 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.
6. Travailler avec les fichiers CSV
Section titled “6. Travailler avec les fichiers CSV”6.1 Écrire un fichier CSV
Section titled “6.1 Écrire un fichier CSV”import csv
# Données à écriredonnees = [ ['Nom', 'Age', 'Ville'], ['Alice', '30', 'Paris'], ['Bob', '25', 'Lyon'], ['Charlie', '35', 'Marseille']]
# Écriture dans le CSVwith open('personnes.csv', 'w', newline='', encoding='utf-8') as fichier_csv: writer = csv.writer(fichier_csv) writer.writerows(donnees) # Écrire toutes les lignesRésultat dans personnes.csv :
Nom,Age,VilleAlice,30,ParisBob,25,LyonCharlie,35,MarseillePoints clés :
newline='': Évite les lignes vides supplémentaires sur Windowsencoding='utf-8': Support des caractères accentuéswriterows(): Écrit plusieurs lignes d’un coup
6.2 Lire un fichier CSV
Section titled “6.2 Lire un fichier CSV”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 ansBob a 25 ansCharlie a 35 ans7. Travailler avec les fichiers JSON
Section titled “7. Travailler avec les fichiers JSON”7.1 Écrire un fichier JSON
Section titled “7.1 Écrire un fichier JSON”import json
# Données Pythondonnees = { 'nom': 'Alice', 'age': 30, 'ville': 'Paris', 'competences': ['Python', 'JavaScript', 'SQL']}
# Sauvegarder en JSONwith 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 indentationensure_ascii=False: Préserve les caractères accentués
7.2 Lire un fichier JSON
Section titled “7.2 Lire un fichier JSON”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 : AliceCompétences : Python, JavaScript, SQL7.3 Conversion entre Python et JSON
Section titled “7.3 Conversion entre Python et JSON”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) → Pythonjson_string = '{"nom": "Charlie", "age": 35}'donnees_python = json.loads(json_string)print(donnees_python['nom']) # Charlie8. Gestion des exceptions liées aux fichiers
Section titled “8. Gestion des exceptions liées aux fichiers”8.1 Exceptions courantes
Section titled “8.1 Exceptions courantes”# FileNotFoundError - Fichier inexistanttry: 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èstry: 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 fichiertry: 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 = Nonetry: 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'ouvririf 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")9. Bonnes pratiques
Section titled “9. Bonnes pratiques”✅ À FAIRE
Section titled “✅ À FAIRE”1. Toujours utiliser with pour gérer les fichiers
# ✅ Bon - Fermeture automatiquewith open('file.txt', 'r') as f: contenu = f.read()
# ❌ Mauvais - Risque de fuite de ressourcesf = open('file.txt', 'r')contenu = f.read()f.close()2. Spécifier l’encodage pour les fichiers texte
# ✅ Bon - Encodage explicitewith open('file.txt', 'r', encoding='utf-8') as f: contenu = f.read()
# ❌ Risqué - Encodage par défaut peut varierwith open('file.txt', 'r') as f: contenu = f.read()3. Utiliser des chemins relatifs ou pathlib
from pathlib import Path
# ✅ Bon - Compatible multiplateformechemin = Path('dossier') / 'fichier.txt'with open(chemin, 'r') as f: contenu = f.read()
# ❌ Moins bon - Chemins en durwith 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éetry: 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 imageswith open('photo.jpg', 'rb') as f: image_data = f.read()
# ❌ Mauvais - Mode texte pour fichiers binaireswith open('photo.jpg', 'r') as f: # Erreur ! image_data = f.read()❌ À ÉVITER
Section titled “❌ À ÉVITER”1. Ne jamais oublier newline='' avec CSV sur Windows
# ❌ Mauvais - Lignes vides sur Windowswith open('data.csv', 'w') as f: writer = csv.writer(f)
# ✅ Bonwith 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émoirewith open('huge_file.txt', 'r') as f: contenu = f.read() # Peut saturer la RAM !
# ✅ Bon - Lecture ligne par lignewith 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 !
# ✅ Bonwith open('file.bin', 'wb') as f: f.write(b"bytes") # Utiliser bytes🎯 Cas d’Usage
Section titled “🎯 Cas d’Usage”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
📋 Évaluation des Connaissances
Section titled “📋 Évaluation des Connaissances”À quoi sert cette évaluation ?
Section titled “À quoi sert cette évaluation ?”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 ! 🚀
📝 Exercices Pratiques
Section titled “📝 Exercices Pratiques”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-leVoir la solution
# Solution complète# Étape 1 : Créer le fichierwith 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 afficherwith open('notes.txt', 'r', encoding='utf-8') as f: for ligne in f: print(ligne.strip())Résultat attendu :
Première noteDeuxième noteTroisième noteExercice 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.txtVoir la solution
# Solution complètewith 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 statistiquesVoir la solution
# Solution complètedef 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")
# Testanalyser_fichier('document.txt')Résultat attendu :
Nombre de lignes : 15Nombre de mots : 127Exercice 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-lesVoir la solution
# Solution complèteimport 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é")
# Testcontacts = [ ['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ésExercice 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 :
- Sauvegarder la configuration
- Charger la configuration
- Modifier un paramètre
- Réinitialiser aux valeurs par défaut
Exemple d’exécution :
# Créez un gestionnaire de configuration complet🎯 Points Clés à Retenir
Section titled “🎯 Points Clés à Retenir”- Utilisez toujours
with: Garantit la fermeture automatique des fichiers - Spécifiez l’encodage :
encoding='utf-8'pour éviter les problèmes - Mode approprié :
'r'lecture,'w'écriture (écrase),'a'ajout,'b'binaire - Itération efficace : Préférez itérer directement sur le fichier plutôt que
read() - Gérez les exceptions : Anticipez
FileNotFoundErroretPermissionError
📚 Pour Aller Plus Loin
Section titled “📚 Pour Aller Plus Loin”Modules Python avancés :
pathlib: Manipulation moderne des chemins de fichiersosetshutil: Opérations sur fichiers et dossiers (copie, déplacement, suppression)pickle: Sérialisation d’objets Python complexesyaml: 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 ! 🐍✨