Fichiers
Gérez efficacement les entrées-sorties dans vos programmes
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
- Toujours utiliser
with
pour gérer les fichiers, assurant leur fermeture même en cas d’erreur. - Spécifier l’encodage lors de l’ouverture de fichiers texte pour éviter les problèmes de caractères spéciaux.
- Gérer les exceptions liées aux fichiers pour rendre votre code plus robuste.
- Utiliser des chemins relatifs plutôt que des chemins absolus pour la portabilité.
- Préférer
pathlib
pour une manipulation moderne et orientée objet des chemins de fichiers. - 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