Fichiers en Python : Lecture et Écriture

Introduction

Manipuler des fichiers est une compétence fondamentale en Python, que ce soit pour sauvegarder des résultats, lire des configurations ou traiter des données. Cet article explore les mécanismes essentiels pour lire et écrire des fichiers, en mettant l'accent sur des pratiques robustes et l'évitement des pièges courants.

Le cycle de vie d'un fichier en Python

Toute opération sur un fichier suit trois étapes :

  1. Ouvrir : obtenir un descripteur via la fonction intégrée open().
  2. Manipuler : utiliser les méthodes de lecture ou d'écriture sur l'objet fichier.
  3. Fermer : libérer les ressources système associées.

L'oubli de la fermeture peut entraîner des fuites de ressources ou la corruption des données.

Ouverture sécurisée avec l'instruction with

Plutôt qu'un appel explicite à close(), il est fortement recommandé d'utiliser le gestionnaire de contexte :

with open('donnees.txt', mode='r', encoding='utf-8') as fichier:
    # Opérations sur le fichier ici
    pass
# Le fichier est automatiquement fermé en sortant du bloc

Cette approche garantit la fermeture même en cas d'exception.

Les modes d'ouverture

Mode Description Comportement si fichier inexistant Comportement si fichier existant
'r' Lecture seule (par défaut) Provoque une erreur Ouvre en lecture au début
'w' Écriture (écrase le contenu) Crée le fichier Vide le fichier avant d'écrire
'a' Ajout en fin de fichier Crée le fichier Ajoute à la fin, conserve le contenu existant
'x' Création exclusive Crée le fichier Provoque FileExistsError

En mode texte, les fins de ligne sont converties automatiquement (par exemple, \n vers \r\n sous Windows). Pour les fichiers binaires (images, etc.), utiliser le mode 'b' (ex : 'rb').

Lire le contenu d'un fichier

La lecture consiste à charger les données du disque vers la mémoire. Python propose plusieurs méthodes adaptées à différents scénarios.

Lire l'intégralité du fichier

La méthode read() retourne l'ensemble du contenu sous forme d'une chaîne. Privilégier cette méthode pour les fichiers de petite taille.

with open('poesie.txt', encoding='utf-8') as fichier:
    texte_complet = fichier.read()
    print(texte_complet)

On peut limiter le nombre de caractères lus : f.read(100).

Lire ligne par ligne

Pour les fichiers volumineux, il est plus efficace de traiter le contenu ligne par ligne pour éviter de saturer la mémoire.

Itération directe sur l'objet fichier :

with open('registre.log', encoding='utf-8') as fichier:
    for ligne in fichier:
        # Traitement de chaque 'ligne'
        print(ligne, end='')

Cette méthode est concise et optimisée pour la mémoire.

Lire toutes les lignes dans une liste

readlines() retourne une liste où chaque élément est une ligne (y compris le caractère de saut de ligne \n).

with open('config.ini', encoding='utf-8') as fichier:
    toutes_lignes = fichier.readlines()
    # Nettoyage possible avec .strip()
    lignes_propres = [ligne.strip() for ligne in toutes_lignes]

Gestion des erreurs et encodage

Il est crucial de prévoir les exceptions comme FileNotFoundError ou UnicodeDecodeError.

from pathlib import Path

chemin = Path('data') / 'texte.txt'
try:
    with open(chemin, encoding='utf-8') as fichier:
        contenu = fichier.read()
except FileNotFoundError:
    print(f"Le fichier '{chemin}' est introuvable.")
except UnicodeDecodeError:
    print("Erreur d'encodage. Essayez 'latin-1' ou 'gbk'.")

Spécifier systématiquement le paramètre encoding (de préférence 'utf-8') évite les comportements dépendants du système.

Écrire des données dans un fichier

L'écriture permet de conserver des données de manière persistante. Le choix du mode ('w', 'a', 'x') détermine le comportement vis-à-vis du contenu existant.

Méthodes d'écriture

  • write(chaine) : écrit la chaîne donnée. Ne rajoute pas automatiquement de saut de ligne.
  • writelines(liste) : écrit toutes les chaînes de la liste. Les sauts de ligne doivent être inclus dans les éléments de la liste.
# Exemple avec write()
with open('sortie.txt', 'w', encoding='utf-8') as fichier:
    fichier.write('Première ligne.\n')
    fichier.write('Deuxième ligne.\n')

# Exemple avec writelines()
lignes_a_ecrire = ['Ligne A\n', 'Ligne B\n', 'Ligne C\n']
with open('sortie2.txt', 'w', encoding='utf-8') as fichier:
    fichier.writelines(lignes_a_ecrire)

Préparation du répertoire

Si le chemin du fichier contient des dossiers inexistants, Python échouera avec FileNotFoundError. Il faut créer la hiérarchie au préalable.

from pathlib import Path

chemin_sortie = Path('resultats') / 'exports' / 'donnees.csv'
# Crée tous les répertoires parents s'ils manquent
chemin_sortie.parent.mkdir(parents=True, exist_ok=True)

Utilisation de pathlib pour simplifier

La classe Path offre des méthodes directes pour la lecture et l'écriture.

from pathlib import Path

mon_fichier = Path('message.txt')
# Écriture directe
mon_fichier.write_text('Bonjour le monde !', encoding='utf-8')

# Lecture directe
contenu = mon_fichier.read_text(encoding='utf-8')
print(contenu)

write_text() écrase le fichier par défaut (mode 'w').

Bonnes pratiques et pièges à éviter

  • Sauts de ligne manquants : avec write(), inclure \n explicitement.
  • Écrasement accidentel : vérifier l'existence du fichier avant d'utiliser le mode 'w'.
  • Encodage : toujours spécifier encoding='utf-8' (ou autre encodage connu).
  • Tampon de sortie : l'utilisation de with ou un appel explicite à close() assure que les données sont bien écrites sur le disque.
# Exemple de vérification avant écrasement
fichier_important = Path('journal.txt')
if fichier_important.exists():
    confirmation = input(" confirmation.lower="" contenu.="" else:="" encoding="utf-8" existe.="" fichier="" fichier_important.write_text="" if="" le="" print="">

Étiquettes: Python fichiers lecture écriture pathlib

Publié le 13 juin à 06h33