Aide-mémoire : les fichiers en Python

Formats, récupération dans Colab, et lecture/écriture - sans librairie, avec numpy, avec pandas

Python pur (ouvrir, lire, écrire) modules csv, json et xml numpy pandas récupérer un fichier dans Colab pièges fréquents

Les formats et leurs extensions

L'extension (les lettres après le point) indique comment le fichier est organisé à l'intérieur. Elle ne change pas toute seule le contenu : c'est à toi de choisir le bon outil pour le lire.

ExtensionCe que le fichier contientComment le lire en Python
.txtTexte brut, libreopen() puis .read() / boucle for
.csvTableau, colonnes séparées par des virgulesmodule csv ou pandas.read_csv
.tsvTableau, colonnes séparées par des tabulationssplit("\t") ou pandas (sep="\t")
.jsonDonnées structurées (dictionnaires, listes)json.load / pandas.read_json
.xlsxClasseur Excel (feuilles, mise en forme)pandas.read_excel
.xmlDonnées dans des balises <...>module xml.etree
.npyTableau numpy enregistré en binairenumpy.load

Texte ou binaire ? .txt, .csv, .tsv, .json et .xml sont des fichiers texte : tu peux les ouvrir dans un éditeur et les lire à l'œil. .xlsx et .npy sont binaires : ils ont besoin d'une bibliothèque (pandas, numpy) pour être décodés.

Récupérer un fichier dans Colab

Dans Google Colab, le fichier n'est pas sur ton ordinateur : il faut d'abord l'amener dans la session. Trois façons, selon d'où vient le fichier.

Téléverser depuis l'ordinateur

files.upload()

from google.colab import files fichiersTeleverses = files.upload() # ouvre une boîte « Parcourir » # ensuite on lit normalement with open("planetes.csv", encoding="utf-8") as fichier: print(fichier.read())

Une fenêtre s'ouvre pour choisir le fichier sur ton disque. Il est copié dans la session. Ne fonctionne que dans Colab, pas en Python normal.

Monter son Google Drive

drive.mount(...)

from google.colab import drive drive.mount("/content/drive") chemin = "/content/drive/MyDrive/foret.csv" with open(chemin, encoding="utf-8") as fichier: print(fichier.read())

Pratique pour les gros fichiers ou ceux qu'on réutilise souvent. Ton Drive apparaît comme un dossier /content/drive/MyDrive/. Colab demande une autorisation la première fois.

Lire un fichier sur le web

une adresse (URL) directement

import pandas as pd url = "https://exemple.com/iris.csv" donnees = pd.read_csv(url) print(donnees.head())

pandas et numpy savent lire directement une adresse http(s):// : pas besoin de télécharger d'abord. Rien à téléverser.

Récupérer un résultat

files.download(...)

from google.colab import files # après avoir écrit resultats.csv dans la session files.download("resultats.csv") # le télécharge sur ton ordi

Les fichiers créés dans Colab disparaissent quand la session se ferme. files.download rapatrie un résultat sur ton ordinateur avant de fermer.

Lire sans librairie : tout d'un coup

Le mot-clé with ouvre le fichier et le referme automatiquement. On donne le nom du fichier et son encodage à open(), puis on lit tout d'un coup avec .read().

with open("foret.csv", encoding="utf-8") as fichier: contenu = fichier.read() print(contenu) # affiche tout le fichier d'un seul coup

with referme le fichier tout seul à la fin du bloc, même en cas d'erreur. encoding="utf-8" évite le bug des accents : sans lui, les e avec accent deviennent des caractères illisibles.

Lire sans librairie : ligne par ligne

Pour traiter un grand fichier sans tout charger en mémoire, on parcourt le fichier directement dans une boucle for. Chaque itération donne une ligne.

Boucle sur le fichier

for ligne in fichier

with open("foret.csv", encoding="utf-8") as fichier: for ligne in fichier: print(ligne.strip())

.strip() enlève le retour de ligne invisible (\n) collé au bout de chaque ligne. Sans lui, on obtient une ligne vide supplémentaire à chaque print.

Toutes les lignes en liste

.readlines()

with open("foret.csv", encoding="utf-8") as fichier: lignes = fichier.readlines() print(lignes[0]) # première ligne print(len(lignes)) # nombre de lignes

Pratique quand on a besoin d'accéder à une ligne par son numéro. Chaque élément de la liste inclut le \n à la fin - pense à .strip().

Découper une ligne CSV avec split

Un fichier CSV (valeurs séparées par des virgules) contient du texte brut. Pour accéder à chaque colonne, on coupe la ligne avec .split(",") - on obtient une liste de textes qu'on peut convertir.

# Contenu du fichier : "sapin,12,nordique" champs = ligne.strip().split(",") espece = champs[0] # "sapin" hauteur = int(champs[1]) # 12 (le fichier ne contient que du texte) region = champs[2] # "nordique"

Tout ce qui vient d'un fichier est du texte (str). Pour faire des calculs avec un nombre lu dans un fichier, il faut le convertir avec int() ou float().

Le module csv

Le module csv de Python gère lui-même le découpage des colonnes - plus besoin de .split(",") à la main. Il gère aussi les cas compliqués (textes avec virgules à l'intérieur, guillemets, etc.).

Lire avec csv.reader

import csv - csv.reader - next()

import csv with open("foret.csv", encoding="utf-8") as fichier: lecteur = csv.reader(fichier) entete = next(lecteur) # saute la première ligne for rangee in lecteur: print(rangee)

next(lecteur) consomme la première ligne (l'en-tête) et la range dans entete. La boucle for repart ensuite à la deuxième ligne. Chaque rangee est une liste de textes.

Écrire avec csv.writer

csv.writer - writerow

import csv with open("sortie.csv", "w", newline="", encoding="utf-8") as fichier: graveur = csv.writer(fichier) graveur.writerow(["espece", "hauteur"]) graveur.writerow(["erable", 12])

writerow prend une liste et la transforme en une ligne CSV bien formée. newline="" évite les lignes vides en trop sous Windows.

Le format JSON

Un fichier .json garde la structure des données : dictionnaires et listes Python s'y retrouvent tels quels. Le module json fait la traduction dans les deux sens.

Lire un fichier .json

json.load(fichier)

import json with open("releves.json", encoding="utf-8") as fichier: donnees = json.load(fichier) print(donnees[0]["temperature"]) # un vrai dictionnaire

json.load rend directement une liste ou un dictionnaire Python : les nombres sont déjà des nombres, pas besoin de convertir. (json.loads, avec un « s », fait pareil à partir d'une chaîne de texte.)

Écrire un fichier .json

json.dump(objet, fichier)

import json donnees = [{"espece": "sapin", "hauteur": 12}] with open("sortie.json", "w", encoding="utf-8") as fichier: json.dump(donnees, fichier, ensure_ascii=False, indent=2)

ensure_ascii=False garde les accents lisibles ; indent=2 met le fichier en forme (sauts de ligne et décalages) pour qu'il reste lisible à l'œil.

Le format XML

Un fichier .xml range les données dans des balises <...>, un peu comme du HTML. Le module xml.etree.ElementTree (livré avec Python) sait les parcourir.

À quoi ça ressemble

balises et attributs

<!-- foret.xml --> <foret> <mesure espece="sapin"> <hauteur>12</hauteur> </mesure> </foret>

espece="sapin" est un attribut (dans la balise ouvrante). 12 est le texte contenu entre <hauteur> et </hauteur>.

Lire un fichier .xml

ET.parse - findall - get / .text

import xml.etree.ElementTree as ET arbre = ET.parse("foret.xml") racine = arbre.getroot() for mesure in racine.findall("mesure"): espece = mesure.get("espece") # un attribut hauteur = mesure.find("hauteur").text # le texte d'une balise

.get("...") lit un attribut, .find("...").text lit le texte d'une sous-balise. Comme pour le CSV, .text est toujours du texte : convertis avec int() ou float() pour calculer.

Avec numpy : des tableaux de nombres

Quand le fichier ne contient que des nombres, numpy les lit directement dans un tableau prêt pour les calculs (moyennes, colonnes, etc.) - sans boucle ni conversion.

Lire des nombres

np.loadtxt

import numpy as np tableau = np.loadtxt("mesures.csv", delimiter=",", skiprows=1) # saute l'en-tête print(tableau[:, 0].mean()) # moyenne de la 1re colonne

delimiter="," indique le séparateur, skiprows=1 saute la ligne de titres. Le résultat est déjà numérique : tableau[:, 0] est la première colonne entière.

Tolérer les trous

np.genfromtxt

import numpy as np tableau = np.genfromtxt("mesures.csv", delimiter=",", skip_header=1) # les cases vides deviennent nan (au lieu de planter)

À utiliser quand certaines cases sont vides : np.loadtxt plante, np.genfromtxt met nan à la place et continue.

Sauver des nombres

np.savetxt - np.save / np.load

import numpy as np np.savetxt("sortie.csv", tableau, delimiter=",") np.save("tableau.npy", tableau) # format binaire numpy memes = np.load("tableau.npy") # on le relit

savetxt écrit un CSV lisible. save/load utilisent le format .npy : plus rapide et exact, mais lisible seulement par numpy.

Avec pandas : des tableaux de données

pandas range les données dans un DataFrame : un tableau avec des colonnes nommées, comme dans Excel. C'est l'outil le plus rapide pour lire CSV, Excel et JSON d'un seul appel.

Lire un CSV

pd.read_csv

import pandas as pd donnees = pd.read_csv("foret.csv") print(donnees.head()) # les premières lignes print(donnees["hauteur"].mean()) # moyenne d'une colonne

L'en-tête devient automatiquement les noms de colonnes : on accède à une colonne par son nom, donnees["hauteur"], sans compter les indices.

Lire Excel et JSON

pd.read_excel - pd.read_json

import pandas as pd labo = pd.read_excel("labo.xlsx") # un classeur .xlsx releves = pd.read_json("releves.json") # un .json en tableau

Même logique pour tous les formats : read_csv, read_excel, read_json rendent tous un DataFrame qu'on manipule de la même façon.

Sauver un tableau

to_csv - to_excel

import pandas as pd donnees.to_csv("sortie.csv", index=False) donnees.to_excel("sortie.xlsx", index=False)

index=False évite d'ajouter une colonne de numéros de ligne dans le fichier. to_excel crée un vrai fichier .xlsx ouvrable dans Excel.

Les modes d'ouverture

Le deuxième argument de open() indique ce qu'on veut faire avec le fichier. Par défaut, Python lit - mais on peut aussi écrire.

ModeCe que ça faitÀ savoir
"r" Lire (read) - par défaut Erreur si le fichier n'existe pas
"w" Écrire (write) - efface tout d'abord Crée le fichier s'il n'existe pas
"a" Ajouter à la fin (append) Ne touche pas au contenu existant

Au programme de ce cours, on lit surtout ("r"). Les modes "w" et "a" servent quand on veut sauvegarder des résultats.

Écrire sans librairie

Même structure que pour la lecture - on change juste le mode en "w" et on appelle .write() au lieu de .read().

with open("resultats.txt", "w", encoding="utf-8") as fichier: fichier.write("erable;12\n") fichier.write("sapin;7\n")

\n dans le texte est le signe du retour à la ligne - sans lui, tout s'écrit sur une seule ligne. Le mode "w" efface le fichier existant avant d'écrire : attention si le fichier contient des données importantes.

Les pièges qui font perdre du temps

Cinq erreurs très fréquentes quand on commence à lire et écrire des fichiers.

Oublier encoding="utf-8"

with open("foret.csv") as fichier: # les accents deviennent illisibles # ex : é devient é

Sur Windows surtout, l'encodage par défaut n'est pas utf-8. Toujours ajouter encoding="utf-8" à open() pour que les accents s'affichent correctement.

Oublier .strip()

for ligne in fichier: champs = ligne.split(",") # champs[-1] vaut "nordique\n" # le \n reste collé au dernier champ

Un retour de ligne invisible (\n) reste collé à la fin de chaque ligne. ligne.strip().split(",") règle le problème : .strip() avant .split().

Oublier de convertir

hauteur = rangee[1] # "12" : du texte hauteur + 1 # TypeError ! int(rangee[1]) + 1 # 13 : correct

Avec le module csv ou un .split(), tout est du texte (str), même ce qui ressemble à un nombre. Convertis avec int() ou float(). (numpy, pandas et json, eux, convertissent déjà.)

Fichier introuvable

with open("foret.CSV", ...) as fichier: # FileNotFoundError # Python ne trouve pas le fichier

FileNotFoundError : vérifier le nom exact (majuscules, extension) et s'assurer que le fichier est dans le même dossier que le programme. Sur Linux, foret.csv et foret.CSV sont deux fichiers différents.

Le fichier a disparu dans Colab

# session redémarrée : with open("planetes.csv", ...) as fichier: # FileNotFoundError, à nouveau

Dans Colab, les fichiers téléversés avec files.upload() disparaissent quand la session se ferme ou se réinitialise. Il faut les re-téléverser - ou les garder sur le Drive monté.