0%
Manipulation de fichiers en Python

Fichiers

Gérez efficacement les entrées-sorties dans vos programmes

10-15 min

Manipulation de fichiers en Python

La manipulation de fichiers est une compétence fondamentale en programmation, essentielle pour sauvegarder des données, traiter des informations et automatiser des tâches. Python offre des outils puissants et flexibles pour travailler avec différents types de fichiers. Dans ce tutoriel, nous explorerons comment lire, écrire et manipuler des fichiers en Python.

Les bases de la manipulation de fichiers

Ouverture et fermeture de fichiers

En Python, vous utilisez la fonction open() pour ouvrir un fichier, qui renvoie un objet fichier :

# Ouvrir un fichier en mode lecture
fichier = open("mon_fichier.txt", "r")

# Opérations sur le fichier
# ...

# Fermer le fichier
fichier.close()

La fonction open() prend deux paramètres principaux :

  • Le chemin du fichier (peut être absolu ou relatif)
  • Le mode d’ouverture (lecture, écriture, etc.)

Modes d’ouverture de fichiers

Python offre plusieurs modes pour ouvrir des fichiers :

  • 'r' : Lecture (mode par défaut)
  • 'w' : Écriture (crée un nouveau fichier ou écrase un fichier existant)
  • 'a' : Ajout (ajoute du contenu à la fin d’un fichier existant)
  • 'b' : Mode binaire (par ex. 'rb' pour lire en binaire)
  • 't' : Mode texte (par défaut, par ex. 'rt' pour lire du texte)
  • '+' : Mode mise à jour (lecture et écriture, par ex. 'r+')

Utilisation du bloc with

La meilleure pratique pour travailler avec des fichiers est d’utiliser le bloc with, qui gère automatiquement la fermeture du fichier, même en cas d’erreur :

# Meilleure façon d'ouvrir un fichier
with open("mon_fichier.txt", "r") as fichier:
    # Opérations sur le fichier
    contenu = fichier.read()
    print(contenu)
# Le fichier est automatiquement fermé à la sortie du bloc with

Lecture de fichiers

Python offre plusieurs méthodes pour lire le contenu d’un fichier.

Lire le fichier entier

with open("mon_fichier.txt", "r") as fichier:
    contenu = fichier.read()
    print(contenu)

Lire ligne par ligne

with open("mon_fichier.txt", "r") as fichier:
    # Lire la première ligne
    premiere_ligne = fichier.readline()
    print(premiere_ligne)
    
    # Lire la deuxième ligne
    deuxieme_ligne = fichier.readline()
    print(deuxieme_ligne)

Lire toutes les lignes dans une liste

with open("mon_fichier.txt", "r") as fichier:
    lignes = fichier.readlines()
    for ligne in lignes:
        print(ligne.strip())  # strip() supprime les espaces et les sauts de ligne

Parcourir un fichier ligne par ligne (méthode efficace pour les gros fichiers)

with open("mon_fichier.txt", "r") as fichier:
    for ligne in fichier:
        print(ligne.strip())

Cette dernière méthode est particulièrement efficace pour les fichiers volumineux car elle ne charge qu’une ligne à la fois en mémoire.

Écriture dans des fichiers

Écrire du texte

with open("mon_fichier.txt", "w") as fichier:
    fichier.write("Bonjour, voici une ligne de texte.\n")
    fichier.write("Et voici une deuxième ligne.")

La méthode write() n’ajoute pas automatiquement de saut de ligne à la fin du texte, vous devez donc l’ajouter explicitement si nécessaire avec \n.

Ajouter du texte à un fichier existant

with open("mon_fichier.txt", "a") as fichier:
    fichier.write("\nCette ligne est ajoutée à la fin du fichier.")

Écrire plusieurs lignes à la fois

lignes = ["Ligne 1", "Ligne 2", "Ligne 3"]
with open("mon_fichier.txt", "w") as fichier:
    fichier.writelines(ligne + "\n" for ligne in lignes)

Gestion des chemins de fichiers

Le module os.path fournit des fonctions pour travailler avec les chemins de fichiers de manière compatible avec différents systèmes d’exploitation :

import os.path

# Vérifier si un fichier existe
if os.path.exists("mon_fichier.txt"):
    print("Le fichier existe.")

# Vérifier si c'est un fichier ou un répertoire
if os.path.isfile("mon_fichier.txt"):
    print("C'est un fichier.")
if os.path.isdir("mon_dossier"):
    print("C'est un répertoire.")

# Obtenir le chemin absolu
chemin_absolu = os.path.abspath("mon_fichier.txt")
print(chemin_absolu)

# Joindre des parties de chemins
chemin_complet = os.path.join("dossier", "sous_dossier", "fichier.txt")
print(chemin_complet)

Pour des opérations plus avancées sur les chemins de fichiers, le module pathlib (disponible depuis Python 3.4) offre une interface orientée objet plus moderne :

from pathlib import Path

# Créer un objet Path
chemin = Path("dossier/sous_dossier/fichier.txt")

# Vérifier si le fichier existe
if chemin.exists():
    print("Le fichier existe.")

# Obtenir le répertoire parent
parent = chemin.parent
print(parent)

# Créer un nouveau chemin en joignant
nouveau_chemin = parent / "autre_fichier.txt"
print(nouveau_chemin)

Travailler avec des fichiers CSV

Les fichiers CSV (Comma-Separated Values) sont couramment utilisés pour stocker des données tabulaires. Python fournit le module csv pour travailler facilement avec ces fichiers.

Lire un fichier CSV

import csv

with open("donnees.csv", "r", newline="") as fichier_csv:
    lecteur = csv.reader(fichier_csv)
    
    # Lire l'en-tête
    en_tete = next(lecteur)
    print(f"Colonnes : {en_tete}")
    
    # Lire les données
    for ligne in lecteur:
        print(ligne)

Lire un fichier CSV en dictionnaire

import csv

with open("donnees.csv", "r", newline="") as fichier_csv:
    lecteur = csv.DictReader(fichier_csv)
    
    for ligne in lecteur:
        print(f"Nom: {ligne['nom']}, Âge: {ligne['age']}")

Écrire dans un fichier CSV

import csv

donnees = [
    ["Nom", "Âge", "Ville"],
    ["Alice", "30", "Paris"],
    ["Bob", "25", "Lyon"],
    ["Charlie", "35", "Marseille"]
]

with open("personnes.csv", "w", newline="") as fichier_csv:
    ecrivain = csv.writer(fichier_csv)
    ecrivain.writerows(donnees)

Écrire dans un fichier CSV en utilisant des dictionnaires

import csv

donnees = [
    {"nom": "Alice", "age": 30, "ville": "Paris"},
    {"nom": "Bob", "age": 25, "ville": "Lyon"},
    {"nom": "Charlie", "age": 35, "ville": "Marseille"}
]

with open("personnes.csv", "w", newline="") as fichier_csv:
    champs = ["nom", "age", "ville"]
    ecrivain = csv.DictWriter(fichier_csv, fieldnames=champs)
    
    ecrivain.writeheader()
    ecrivain.writerows(donnees)

Travailler avec des fichiers JSON

JSON (JavaScript Object Notation) est un format léger d’échange de données. Python fournit le module json pour travailler avec ce format.

Lire un fichier JSON

import json

with open("donnees.json", "r") as fichier_json:
    donnees = json.load(fichier_json)
    print(donnees)

Écrire dans un fichier JSON

import json

donnees = {
    "personnes": [
        {"nom": "Alice", "age": 30, "ville": "Paris"},
        {"nom": "Bob", "age": 25, "ville": "Lyon"},
        {"nom": "Charlie", "age": 35, "ville": "Marseille"}
    ]
}

with open("personnes.json", "w") as fichier_json:
    json.dump(donnees, fichier_json, indent=4)  # indent pour un format plus lisible

Manipulation de fichiers binaires

Les fichiers binaires contiennent des données qui ne sont pas en format texte lisible par l’homme. Python peut les gérer en utilisant le mode 'b'.

Lire un fichier binaire

with open("image.jpg", "rb") as fichier_binaire:
    donnees = fichier_binaire.read()
    print(f"Taille du fichier : {len(donnees)} octets")

Écrire dans un fichier binaire

donnees_binaires = b'\x00\x01\x02\x03'  # Exemple de données binaires
with open("binaire.bin", "wb") as fichier_binaire:
    fichier_binaire.write(donnees_binaires)

Gestion des exceptions lors de la manipulation de fichiers

Lorsque vous travaillez avec des fichiers, il est important de gérer les exceptions qui pourraient survenir :

try:
    with open("fichier_inexistant.txt", "r") as fichier:
        contenu = fichier.read()
except FileNotFoundError:
    print("Le fichier n'existe pas.")
except PermissionError:
    print("Vous n'avez pas les permissions nécessaires pour accéder à ce fichier.")
except IsADirectoryError:
    print("C'est un répertoire, pas un fichier.")
except Exception as e:
    print(f"Une erreur inattendue s'est produite : {e}")

Manipulation de dossiers (répertoires)

Python fournit des fonctions pour créer, lister et supprimer des répertoires.

Créer un répertoire

import os

# Créer un seul répertoire
os.mkdir("nouveau_dossier")

# Créer des répertoires imbriqués
os.makedirs("parent/enfant/petit-enfant", exist_ok=True)  # exist_ok=True évite l'erreur si le dossier existe déjà

Lister le contenu d’un répertoire

import os

# Lister tous les fichiers et dossiers
contenu = os.listdir("mon_dossier")
print(contenu)

# Obtenir uniquement les fichiers
fichiers = [f for f in os.listdir("mon_dossier") if os.path.isfile(os.path.join("mon_dossier", f))]
print(fichiers)

Parcourir un arborescence de répertoires

import os

for dossier_racine, sous_dossiers, fichiers in os.walk("mon_dossier"):
    print(f"Dossier actuel : {dossier_racine}")
    print(f"Sous-dossiers : {sous_dossiers}")
    print(f"Fichiers : {fichiers}")
    print()

Utilisation de fichiers temporaires

Le module tempfile permet de créer des fichiers et répertoires temporaires :

import tempfile

# Créer un fichier temporaire
with tempfile.TemporaryFile() as tmp:
    tmp.write(b"Données temporaires")
    tmp.seek(0)  # Retourner au début du fichier
    data = tmp.read()
    print(data)
# Le fichier est automatiquement supprimé

# Créer un répertoire temporaire
with tempfile.TemporaryDirectory() as tmp_dir:
    print(f"Répertoire temporaire créé : {tmp_dir}")
# Le répertoire est automatiquement supprimé

Comprendre les encodages de caractères

Lorsque vous travaillez avec des fichiers texte, l’encodage des caractères est important, surtout pour les textes contenant des caractères non-ASCII.

# Spécifier l'encodage lors de l'ouverture du fichier
with open("fichier_utf8.txt", "r", encoding="utf-8") as f:
    texte = f.read()

# Écrire avec un encodage spécifique
with open("nouveau_fichier.txt", "w", encoding="utf-8") as f:
    f.write("Texte avec des caractères spéciaux : éèêà")

Les encodages courants incluent :

  • 'utf-8' : L’encodage le plus courant pour le web et les systèmes modernes
  • 'latin-1' ou 'iso-8859-1' : Un encodage plus ancien pour les langues occidentales
  • 'ascii' : Limité aux caractères ASCII (0-127)
  • 'cp1252' : L’encodage par défaut de Windows pour les langues occidentales

Bonnes pratiques

  1. Toujours utiliser with pour gérer les fichiers, assurant leur fermeture même en cas d’erreur.
  2. Spécifier l’encodage lors de l’ouverture de fichiers texte pour éviter les problèmes de caractères spéciaux.
  3. Gérer les exceptions liées aux fichiers pour rendre votre code plus robuste.
  4. Utiliser des chemins relatifs plutôt que des chemins absolus pour la portabilité.
  5. Préférer pathlib pour une manipulation moderne et orientée objet des chemins de fichiers.
  6. Utiliser les modules spécialisés (csv, json, etc.) plutôt que de parser manuellement les formats.

Conclusion

La manipulation de fichiers est une compétence essentielle en programmation Python. Que vous travailliez avec des fichiers texte simples, des formats structurés comme CSV et JSON, ou des fichiers binaires, Python offre des outils robustes et flexibles pour gérer vos besoins.

Dans ce tutoriel, nous avons exploré les bases de l’ouverture, la lecture et l’écriture de fichiers, ainsi que des techniques plus avancées pour travailler avec différents formats et gérer des situations complexes.

Dans le prochain tutoriel, nous explorerons les bibliothèques standard de Python, qui incluent de nombreux modules puissants pour diverses tâches, y compris des fonctionnalités avancées de manipulation de fichiers.

Commentaires

Les commentaires sont alimentés par GitHub Discussions

Connectez-vous avec GitHub pour participer à la discussion

Lien copié !