Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

  1. Accueil
  2. Blog
  3. Développement de logiciels

Développement de logiciels

Gestion des fichiers Python : Lecture, écriture, CSV, JSON et pathlib avec exemples

Presque tous les vrais scripts lisent ou écrivent un fichier. Apprenez comment ouvrir des fichiers en toute sécurité, choisissez le bon mode, gérez CSV et JSON, travaillez avec des chemins à l’aide de pathlib et évitez l’erreur qui efface vos données.

9 min de lecture
Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

À retenir

  • Ouvrez toujours les fichiers avec un bloc with pour qu’ils se ferment automatiquement.
  • Le mode "w" efface un fichier existant. Utilisez "a" pour en ajouter un, ou "x" pour refuser l’écrasement.
  • Parcourez l’objet fichier pour lire des fichiers volumineux sans tout charger en mémoire.
  • Passez encoding="utf-8" explicitement et préférez pathlib pour créer des chemins.

Logs, rapports, configuration, exports : tôt ou tard, chaque script touche le système de fichiers. La gestion des fichiers Python est simple au départ, mais quelques détails déterminent si votre code est fiable ou détruit silencieusement les données.

Ce guide couvre les fichiers texte, CSV, JSON, les données binaires et les chemins, en mettant l’accent sur les habitudes sûres. Nous avons exécuté ces exemples sur Python 3.13 dans un dossier temporaire, et le résultat affiché provient de cette exécution.

Ouvrez les fichiers avec open() et avec

La fonction intégrée open() renvoie un objet fichier. Utilisez-le dans un bloc with :

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("first line\n")
    file.write("second line\n")

print(file.closed)

# True

Lorsque le bloc se termine, Python ferme le fichier, même si une erreur s’est produite à l’intérieur. Sans with, vous devez appeler close() vous-même et une exception peut sauter cette ligne. L’utilisation d’un fichier après sa fermeture génère une erreur :

file.read()

# ValueError: I/O operation on closed file.

Modes de fichiers

Le deuxième argument de open() indique ce que vous envisagez de faire :

Mode Signification Si le fichier existe Si ce n’est pas le cas
r Lire (par défaut) L’ouvre Erreur
w Écrire L’efface d’abord Le crée
un Ajouter Ajoute à la fin Le crée
x Création exclusive Erreur Le crée
r+ Lire et écrire L’ouvre Erreur

Ajoutez b pour les données binaires, comme dans "rb" ou "wb". Le texte est la valeur par défaut, et il peut également être écrit explicitement sous la forme t.

Écrivez et ajoutez

write() n’ajoute pas de saut de ligne, alors incluez \n vous-même. L’ajout conserve ce qui est déjà là :

with open("notes.txt", "a", encoding="utf-8") as file:
    file.write("third line\n")

Comparez cela avec le mode "w", qui a remplacé nos trois lignes par une seule, sans aucun avertissement :

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("replaced\n")

# notes.txt now contains only: replaced

Lorsque vous ne devez pas écraser quelque chose, utilisez "x". Il a soulevé FileExistsError dans notre test, puisque notes.txt existait déjà.

Lire un fichier

Il existe plusieurs manières de lire, et le bon choix dépend de la taille du fichier :

Approche Retours Idéal pour
file.read() Une chaîne avec tout Petits fichiers
file.readline() La ligne suivante Lire un en-tête
file.readlines() Une liste de lignes Petits fichiers dont vous avez besoin sous forme de liste
pour la ligne du fichier Une ligne à la fois N’importe quelle taille, en particulier les fichiers volumineux
with open("notes.txt", encoding="utf-8") as file:
    print(repr(file.read()))

# 'first line\nsecond line\n'

with open("notes.txt", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

# first line
# second line
# third line

Notez les caractères \n conservés dans la chaîne brute. strip() les supprime. Un objet fichier mémorise également sa position, donc la lecture continue là où elle s’est arrêtée :

with open("notes.txt", encoding="utf-8") as file:
    print(file.readline().strip())
    print(file.readlines())

# first line
# ['second line\n', 'third line\n']

La boucle sur le fichier est la technique clé pour les gros journaux et les exportations. Il lit une ligne à la fois, donc un fichier de plusieurs gigaoctets n’a pas besoin de tenir en mémoire.

Gérer les erreurs de fichiers

Des fichiers peuvent être manquants, verrouillés ou illisibles, alors prévoyez cela :

try:
    with open("missing.txt", encoding="utf-8") as file:
        data = file.read()
except FileNotFoundError as error:
    print(error)

# [Errno 2] No such file or directory: 'missing.txt'
Exception Cause typique
ErreurFichierNotFound Le chemin n’existe pas
FichierExisteErreur Mode x sur un fichier existant
Erreur d'autorisation Non autorisé ou verrouillé sous Windows
IsADirectoryError Le chemin est un dossier
UnicodeDecodeError Le mauvais encodage a été utilisé

Essayez d’ouvrir le fichier et de détecter l’erreur, plutôt que de vérifier d’abord avec exists(), car le fichier pourrait disparaître entre la vérification et l’ouverture. Notre guide sur la gestion des exceptions Python couvre cette approche.

Fichiers CSV

Ne divisez pas vous-même les lignes CSV par des virgules, car les valeurs citées peuvent contenir des virgules. Le module standard csv gère ces règles. DictWriter et DictReader sont les options les plus lisibles :

import csv

with open("orders.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["id", "customer", "total"])
    writer.writeheader()
    writer.writerow({"id": 1, "customer": "Asha", "total": 1200})
    writer.writerow({"id": 2, "customer": "Ben", "total": 300})

with open("orders.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))

print(rows[0])
print(sum(int(r["total"]) for r in rows))

# {'id': '1', 'customer': 'Asha', 'total': '1200'}
# 1500

Deux détails comptent. Passez newline="" lors de l’ouverture de fichiers CSV, comme le recommande la documentation, pour éviter les lignes vides sous Windows. Et chaque valeur revient sous la forme d’une chaîne, nombres pairs, c’est pourquoi nous avions besoin de int() dans la somme. Pour les travaux de données volumineux, une bibliothèque telle que pandas peut être une meilleure solution.

Fichiers JSON

JSON est le format habituel pour les données de configuration et d’API. Il correspond parfaitement aux dictionnaires Python et répertorie :

import json

config = {"debug": True, "retries": 3, "hosts": ["a", "b"]}

with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2)

with open("config.json", encoding="utf-8") as file:
    print(json.load(file)["retries"])

# 3

Rappelez-vous le nom : dump et load fonctionnent avec des fichiers, tandis que dumps et loads fonctionnent avec des chaînes. Les types tels que les dates ne peuvent pas être stockés directement, vous devrez donc d’abord les convertir en chaînes.

Travailler avec des chemins à l’aide de pathlib

Le collage de chemins avec des chaînes s’interrompt sur tous les systèmes d’exploitation. Le module standard pathlib gère les séparateurs pour vous et propose des raccourcis pratiques :

from pathlib import Path

path = Path("data") / "reports" / "summary.txt"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("all good\n", encoding="utf-8")

print(path.read_text(encoding="utf-8").strip())   # all good
print(path.suffix, path.stem, path.exists())      # .txt summary True
print(sorted(p.name for p in Path(".").glob("*.csv")))
# ['orders.csv']
Tâche cheminlib
Rejoindre les chemins Chemin("a") / "b.txt"
Créer des dossiers path.mkdir(parents=True, exist_ok=True)
Lire ou écrire un texte entier read_text(), write_text()
Rechercher des fichiers glob("*.csv"), rglob("*.py")
Supprimer un fichier path.unlink()
Récupère le dossier du script actuel Path(__file__).parent

Ce dernier résout un mal de tête courant. Les chemins relatifs sont résolus à partir de l’endroit où vous avez exécuté le script, et non à partir de l’endroit où se trouve le script, donc la construction de chemins à partir de Path(__file__).parent évite de nombreuses surprises de type “fichier introuvable”.

Fichiers binaires

Les images, fichiers PDF et ZIP ne sont pas du texte. Ouvrez-les avec b, et vous lisez et écrivez bytes, sans aucun encodage impliqué :

with open("pixel.bin", "wb") as file:
    file.write(bytes([255, 0, 128]))

with open("pixel.bin", "rb") as file:
    print(file.read())

# b'\xff\x00\x80'

Écritures plus sûres

Si un programme plante au milieu de l’écriture d’un fichier important, vous pouvez vous retrouver avec un résultat corrompu. Une solution courante consiste à écrire d’abord dans un fichier temporaire, puis à le remplacer :

temp = Path("settings.tmp")
temp.write_text("new", encoding="utf-8")
temp.replace("settings.txt")

print(Path("settings.txt").read_text(), temp.exists())

# new False

replace() écrase la destination. Sur le même système de fichiers, le changement de nom est généralement atomique, donc les lecteurs voient soit l’ancien fichier, soit le nouveau plutôt qu’un mix à moitié écrit.

Astuce : Ne créez jamais de chemins de fichiers directement à partir des entrées de l’utilisateur sans les vérifier. Une valeur telle que ../../secrets.txt pourrait atteindre des fichiers en dehors de votre dossier prévu. Ceci est connu sous le nom de vulnérabilité de traversée de chemin.

Un exemple pratique : résumer un journal

Ce court script rassemble plusieurs idées. Il lit un journal une ligne à la fois, donc sa taille n’a pas d’importance, compte chaque niveau en utilisant Counter et écrit un résumé dans un nouveau fichier :

from collections import Counter

counts = Counter()
with open("app.log", encoding="utf-8") as file:
    for line in file:
        counts[line.split()[0]] += 1

with open("summary.txt", "w", encoding="utf-8") as out:
    for level, total in counts.most_common():
        out.write(f"{level}: {total}\n")

# summary.txt
# ERROR: 2
# INFO: 2
# WARN: 1

Notre exemple de journal comportait cinq lignes. Une ligne vide serait interrompue line.split()[0], donc les vrais scripts devraient d’abord sauter les lignes vides.

Erreurs courantes

  • Utiliser "w" alors que vous vouliez dire "a". Vos données existantes sont immédiatement ouvertes, même si vous n’écrivez jamais rien.
  • Omettre l’encodage. La valeur par défaut varie selon le système, donc un script qui fonctionne sous Linux peut échouer sous Windows avec du texte accentué ou des emoji.
  • Appel de read() sur des fichiers volumineux. Cela peut épuiser la mémoire, alors faites plutôt une boucle sur les lignes.
  • Oublier int() sur les valeurs CSV. "10" + "20" donne "1020".
  • En laissant de côté newline="" pour CSV. Vous pouvez obtenir des lignes vides inattendues sous Windows.
  • Ne pas tester le code du fichier. Utilisez le dispositif tmp_path de pytest pour que les tests ne touchent jamais de vrais fichiers. Consultez notre tutoriel pytest.

Pour conclure

Quelques habitudes couvrent presque tout ici : utilisez with, définissez l’encodage, réfléchissez à deux fois à "w" et laissez csv, json et pathlib faire les parties difficiles. Pour vous entraîner, écrivez un petit script qui lit un CSV, totalise une colonne et enregistre un résumé JSON dans un nouveau dossier.

Questions fréquentes

Comment lire un fichier ligne par ligne en Python ?

Ouvrez-le dans un bloc with et faites une boucle sur l’objet fichier. Cela lit une ligne à la fois, donc cela fonctionne bien même pour les très gros fichiers.

Quelle est la différence entre w et un mode ?

Le mode w efface tout contenu existant dès l’ouverture du fichier. Le mode a conserve le contenu existant et ajoute de nouvelles données à la fin du fichier.

Pourquoi devrais-je utiliser with pour ouvrir un fichier ?

L’instruction with ferme automatiquement le fichier à la fin du bloc, même si une erreur se produit. Cela évite les fuites et permet de garantir l’écriture des données.

Comment vérifier si un fichier existe en Python ?

Utilisez Path(“name.txt”).exists() depuis pathlib. Si vous envisagez de l’ouvrir immédiatement après, il est généralement plus fiable de détecter FileNotFoundError que de vérifier d’abord.

Pourquoi mon CSV a-t-il des lignes vides sous Windows ?

Vous avez probablement ouvert le fichier sans newline=””. Le module csv gère lui-même les fins de ligne, alors transmettez cet argument pour éviter les lignes vides supplémentaires.

Continuez à apprendre

Travailler avec Stack Quora

Besoin d’aide pour les tests, WordPress ou le référencement ?

Nous aidons les équipes à proposer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous vous proposerons une prochaine étape claire.

Continuez à lire

Plus de guides sur tests, IA et développement moderne

Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.

Intelligence artificielle

Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire

Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …

Lire l'article →
DevOps

Variables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués

Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…

Lire l'article →
Développement logiciel

Limitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429

Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…

Lire l'article →
Automatisation des tests

Se moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests

Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…

Lire l'article →
Tests logiciels

Couverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %

Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…

Lire l'article →
Bases de données et SQL

DELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser

DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …

Lire l'article →
Bases de données et SQL

Vues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples

Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …

Lire l'article →
Développement logiciel

Interface TypeScript vs Type : différences réelles, testées avec le compilateur

Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…

Lire l'article →
Développement logiciel

Python *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs

Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…

Lire l'article →
Développement logiciel

Fonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser

Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…

Lire l'article →
Intelligence artificielle

Que sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter

Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…

Lire l'article →
DevOps

Surveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces

Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…

Lire l'article →
DevOps

Volumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière

Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…

Lire l'article →
Automatisation des tests

TDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser

TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…

Lire l'article →
Tests logiciels

Tests d'acceptation utilisateur (UAT) : processus, liste de contrôle et exemples réels

Les tests d'acceptation des utilisateurs sont expliqués : qui les exécute, en quoi ils diffèrent du contrôle qualité, un processus en sept étapes, u…

Lire l'article →
Bases de données et SQL

Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

Les valeurs SQL NULL expliquées avec les requêtes que nous avons exécutées : logique à trois valeurs, IS NULL, COALESCE, NULLIF, comment les agrégat…

Lire l'article →
Bases de données et SQL

Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

SQL CASE WHEN expliqué avec les requêtes que nous avons exécutées : formulaires simples et recherchés, ordre des conditions, pivots avec SUM, astuce…

Lire l'article →
Développement logiciel

Qu'est-ce que JWT ? Les jetons Web JSON expliqués avec un exemple fonctionnel

Qu’est-ce que JWT ? JSON Web Tokens expliqué : les trois parties, un jeton construit et falsifié dans le code que nous avons exécuté, JWT vs session…

Lire l'article →
Développement logiciel

Boucle d'événements JavaScript expliquée : pile d'appels, microtâches et minuteries avec des exemples

La boucle d'événements JavaScript expliquée avec le code que nous avons exécuté : pile d'appels, files d'attente de tâches et de microtâches, pourqu…

Lire l'article →
Développement logiciel

Générateurs Python et rendement expliqués : économisez de la mémoire avec des exemples réels

Les générateurs Python et le rendement expliqués avec le code que nous avons exécuté : comment ils s'arrêtent et reprennent, les économies de mémoir…

Lire l'article →
Intelligence artificielle

Que sont les intégrations ? Vecteurs et similarité cosinus expliqués simplement

Que sont les intégrations ? Un guide en langage simple sur les vecteurs, la similarité cosinus et la recherche sémantique, avec un petit exemple que…

Lire l'article →
DevOps

Déploiement Bleu-Vert vs Canary : différences, compromis et comment choisir

Explication du déploiement bleu-vert ou canari : comment chacun fonctionne, coût, risque et restauration, regroupement d'utilisateurs stable que nou…

Lire l'article →
Automatisation des tests

Tests instables : quelles sont leurs causes et comment les corriger définitivement

Des tests irréguliers expliqués avec des démos que nous avons exécutées : les principales causes, comment en confirmer et en diagnostiquer une, les …

Lire l'article →
Tests logiciels

Tests de charge vs tests de contrainte : différences, métriques et exemples k6

Explication des tests de charge et des tests de stress : ce que chacun prouve, les tests de pointe et de trempage, les métriques qui comptent, pourq…

Lire l'article →
Tests logiciels

Scénario de test et scénario de test : principales différences, exemples et quand les utiliser

Scénario de test et scénario de test expliqués : des définitions claires, un tableau côte à côte, une fonctionnalité de réinitialisation de mot de p…

Lire l'article →
Bases de données et SQL

Optimisation des requêtes SQL : lire les plans d'exécution et corriger les requêtes lentes, avec des délais

Optimisation des requêtes SQL testée sur un million de lignes : lire les plans d'exécution, ajouter les bons index, corriger les filtres non Sargabl…

Lire l'article →
Bases de données et SQL

SQL UNION vs UNION ALL : différences, exemples et performances testées

SQL UNION vs UNION ALL expliqué avec les requêtes que nous avons exécutées : des doublons, les règles suivent toutes les deux, un véritable bug de d…

Lire l'article →
Développement logiciel

Tutoriel API JavaScript Fetch : GET, POST, gestion des erreurs et délais d'attente

Un didacticiel de l'API JavaScript Fetch testé sur un serveur local : GET et POST, pourquoi 404 ne lance pas, un assistant réutilisable, des chaînes…

Lire l'article →
Développement logiciel

Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

Gestion des fichiers Python expliquée avec le code que nous avons exécuté : modes ouverts, avec lecture de fichiers volumineux, CSV, JSON, pathlib, …

Lire l'article →
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.

Lire l'article →
Développement logiciel

List comprehension Python : syntaxe, exemples et cas à éviter

La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…

Lire l'article →
Bases de données et SQL

Jointures SQL expliquées avec exemples (Inner, Left, Right, Full)

Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…

Lire l'article →