L'ascenseur descendant vers les archives souterraines grinçait, un son de chaînes rouillées. Ici, sous cinquante pieds de béton et d'oubli, dormaient les fichiers. Les vrais dossiers. Pas ceux des serveurs, volatils, mais la trace physique, l'encre sur papier, l'octet magnétique sur disque. La mémoire longue. En Python, manipuler des fichiers, c'est savoir lire le passé et écrire l'avenir. Ou les effacer.
Lecture et écriture de fichiers texte
Le format le plus brut. Le plus humain. Et le plus traître.
Écrire : graver une trace.
# 'w' pour write. Écrase tout ce qui existait. Définitif.
with open("instructions.txt", "w", encoding="utf-8") as f:
f.write("Rendez-vous: Pont de Bir-Hakeim, minuit.\n")
f.write("Code: Nébuleuse.\n")
f.write("Abort si pluie > 5mm.\n")
# À la sortie du bloc 'with', le fichier est fermé automatiquement.
# Comme une porte blindée qui se verrouille derrière vous.
# 'a' pour append. Ajoute à la fin. Plus discret.
with open("log_rencontres.txt", "a", encoding="utf-8") as log:
log.write("2023-10-27 23:15: Contact 'Vega' - informations échangées.\n")
Lire : extraire une information.
# Lire l'intégralité d'un petit fichier
with open("instructions.txt", "r", encoding="utf-8") as f:
contenu_complet = f.read()
# print(contenu_complet)
# Lire ligne par ligne (pour les gros fichiers, ne pas tout charger en mémoire)
noms_cibles = []
with open("liste_noire.txt", "r", encoding="utf-8") as f:
for ligne in f:
nom_propre = ligne.strip() # Enlève les sauts de ligne et espaces
if nom_propre: # Ignore les lignes vides
noms_cibles.append(nom_propre)
La lecture/écriture de texte est fondamentale. C'est par là que passent les configurations, les logs, les messages codés, les listes de cibles.
Gestion des fichiers CSV
Le format du commerçant, du comptable. Des colonnes, des virgules. Parfait pour les données structurées, les listes de contacts, les transactions.
import csv
# Écrire un CSV (liste de membres d'une équipe éphémère)
equipe_alpha = [
{"pseudo": "Manta", "role": "surveillance", "paiement": 15000},
{"pseudo": "Raven", "role": "logistique", "paiement": 12000},
{"pseudo": "Wraith", "role": "exécution", "paiement": 25000}
]
with open("equipe_alpha.csv", "w", newline='', encoding="utf-8") as csvfile:
# Définir les colonnes
noms_champs = ["pseudo", "role", "paiement"]
writer = csv.DictWriter(csvfile, fieldnames=noms_champs)
writer.writeheader() # Écrire l'en-tête
for membre in equipe_alpha:
writer.writerow(membre)
# Lire un CSV (par exemple, une liste de fournisseurs)
fournisseurs = []
with open("contacts_logistiques.csv", "r", newline='', encoding="utf-8") as csvfile:
reader = csv.DictReader(csvfile) # Lit chaque ligne comme un dictionnaire
for row in reader:
fournisseurs.append(row)
# print(f"Fournisseur: {row['nom']}, Spécialité: {row['specialite']}")
Le CSV est lisible par n'importe quel tableur. C'est à la fois sa force et son danger. Trop accessible.
Gestion des fichiers JSON
Le format des échanges modernes. Structuré, hiérarchique. Parfait pour les configurations complexes, les profils d'agents, les plans d'opération.
import json
# Écrire un JSON (dossier complet sur une cible)
dossier_vogel = {
"cible": "Ernst Vogel",
"statut": "sous surveillance",
"reseaux": ["banque", "politique"],
"adresses": [
{"type": "principal", "ville": "Zurich"},
{"type": "secondaire", "ville": "Vienne"}
],
"derniere_mise_a_jour": "2023-10-26"
}
with open("dossier_vogel.json", "w", encoding="utf-8") as f:
json.dump(dossier_vogel, f, indent=2, ensure_ascii=False)
# `indent=2` pour une lecture humaine. En production, on l'enlève.
# `ensure_ascii=False` pour garder les accents.
# Lire un JSON (récupérer un plan d'action)
with open("plan_phoenix.json", "r", encoding="utf-8") as f:
plan = json.load(f)
# print(f"Opération: {plan['nom']}")
# print(f"Première étape: {plan['etapes'][0]}")
Le JSON est devenu la lingua franca des échanges de données. Léger, flexible. Il se parse facilement. Il se manipule aisément. C'est le format de choix pour la plupart des opérations automatisées.
Contexte with
La clé de voûte. La garantie.
# MAUVAIS - risque de laisser le fichier ouvert en cas d'erreur
f = open("donnees_cruciales.txt", "r")
contenu = f.read()
# ... un plantage ici ...
f.close() # Cette ligne ne serait jamais exécutée !
# BON - le fichier est fermé même en cas d'erreur ou d'interruption
with open("donnees_cruciales.txt", "r") as f:
contenu = f.read()
# Si une exception se produit ici, le fichier est QUAND MÊME fermé.
# Ici, le fichier est fermé. Toujours.
Le with (gestionnaire de contexte) garantit que la ressource (le fichier) sera proprement fermée, libérée, nettoyée. C'est une question de professionnalisme. Dans notre métier, ne pas fermer un fichier, c'est comme laisser ses empreintes sur la poignée de porte. C'est une négligence qui se paie cher.
L'ascenseur s'était arrêté. Devant moi, des kilomètres d'étagères, des boîtes numérotées. Chaque boîte, un fichier. Chaque fichier, une vie, une affaire, un secret.
J'ai sorti une boîte au hasard. À l'intérieur, un fichier JSON jauni : le plan d'une opération qui avait mal tourné, il y a dix ans. J'ai lu. J'ai compris l'erreur. Un fichier log mal fermé, une trace laissée dans la mémoire tampon du système.
Les fichiers sont la mémoire du monde. Savoir les lire, c'est comprendre. Savoir les écrire, c'est influencer. Savoir les effacer, c’est survivre.
Et toujours, toujours, utiliser un with.
Les données sont des armes. Les fichiers sont leurs fourreaux.