Aide-mémoire : les données à distance

Aller chercher un fichier ou une API sur le web - urllib, json, pandas

l'adresse (URL) télécharger avec urllib lire une API JSON raccourci pandas erreurs réseau et pièges

Anatomie d'une adresse (URL)

Une URL est l'adresse exacte d'une ressource sur le web. Pour lire des données, elle doit pointer vers le fichier brut lui-même (qui finit souvent par .csv ou .json), pas vers une jolie page qui l'entoure.

https://exemple.com/data/2026/mesures.csv
MorceauExempleCe que c'est
Protocolehttps://la façon de transporter (https = sécurisé)
Domaineexemple.comle serveur, la « maison » qui héberge
Chemin/data/2026les dossiers à l'intérieur du serveur
Ressource/mesures.csvle fichier visé (son extension compte)

Coller l'URL dans le navigateur est le test le plus simple : si tu vois le texte brut du CSV ou du JSON s'afficher, l'adresse est bonne pour Python.

Télécharger du texte avec urllib

Le module urllib.request est inclus dans Python (rien à installer). Il ouvre l'URL comme on ouvrirait un fichier, et .read() en récupère le contenu.

import urllib.request url = "https://exemple.com/mesures.csv" with urllib.request.urlopen(url) as reponse: texte = reponse.read().decode("utf-8") for ligne in texte.splitlines(): print(ligne)

.read() rend des octets bruts (type bytes) ; .decode("utf-8") les transforme en texte (type str) avec les bons accents. Ensuite, ce texte se traite comme n'importe quel contenu de fichier (.splitlines(), .split(","), etc.).

Lire une API qui renvoie du JSON

Beaucoup de services (météo, astronomie, finance...) répondent en JSON. On télécharge le texte avec urllib, puis json.loads le transforme en dictionnaire ou liste Python.

urllib + json.loads

json.loads(texte)

import urllib.request import json url = "https://api.exemple.com/planetes" with urllib.request.urlopen(url) as reponse: texte = reponse.read().decode("utf-8") donnees = json.loads(texte) # dict ou liste print(donnees[0]["nom"])

json.loads (avec un « s », pour string) lit une chaîne ; json.load (sans « s ») lit un fichier ouvert. Sur le web on a du texte, donc loads.

Naviguer dans la réponse

[ ] par clé et par indice

# réponse typique d'une API : # {"resultats": [{"nom": "Mars", "rayon": 3389}]} liste = donnees["resultats"] # une liste premier = liste[0] # un dictionnaire print(premier["rayon"]) # 3389

Une réponse JSON est un empilement de dictionnaires et de listes. On descend dedans avec ["cle"] pour un dictionnaire et [indice] pour une liste, l'un après l'autre.

Le raccourci pandas (et numpy)

pandas et numpy savent ouvrir une URL directement, sans passer par urllib. C'est la façon la plus courte quand le fichier distant est un CSV ou un JSON de tableau.

pandas lit l'URL

pd.read_csv(url) - pd.read_json(url)

import pandas as pd url = "https://exemple.com/iris.csv" donnees = pd.read_csv(url) # télécharge ET range en tableau print(donnees.head())

Une seule ligne fait tout : télécharger, décoder et organiser en DataFrame. pd.read_json(url) fait pareil pour un JSON en forme de tableau.

numpy aussi

np.genfromtxt(url, ...)

import numpy as np url = "https://exemple.com/mesures.csv" tableau = np.genfromtxt(url, delimiter=",", skip_header=1)

Pour des données purement numériques, numpy télécharge et lit en un appel. À retenir : urllib marche partout ; pandas/numpy sont des raccourcis pour les formats qu'ils connaissent.

Gérer les erreurs réseau

Le réseau peut échouer : page introuvable (404), serveur en panne, pas de connexion. Avec try / except, le programme prévient au lieu de planter brutalement.

import urllib.request import urllib.error url = "https://exemple.com/mesures.csv" try: with urllib.request.urlopen(url, timeout=10) as reponse: texte = reponse.read().decode("utf-8") print(texte) except urllib.error.URLError as erreur: print("Impossible de joindre le serveur :", erreur)

timeout=10 abandonne après 10 secondes au lieu d'attendre indéfiniment. urllib.error.URLError attrape les pannes de réseau et de serveur (y compris les 404). Toujours prévoir ce filet quand on dépend du web.

Les pièges qui font perdre du temps

Cinq erreurs très fréquentes quand les données viennent du web.

Oublier .decode()

texte = reponse.read() # b"sapin,12\n..." texte.split(",") # TypeError : c'est des bytes

Sans .decode("utf-8"), .read() rend des octets (bytes), reconnaissables au b"..." devant. Les méthodes de texte plantent dessus. Décode juste après le .read().

Oublier https://

url = "exemple.com/iris.csv" urllib.request.urlopen(url) # ValueError : unknown url type

Python a besoin du protocole complet. Une URL doit toujours commencer par http:// ou https://, sinon il ne sait pas comment s'y prendre.

Pointer une page, pas le fichier

# mauvais : la page d'aperçu GitHub # .../blob/main/iris.csv -> du HTML # bon : le fichier brut (raw) # .../raw/main/iris.csv -> le vrai CSV

Beaucoup de sites entourent le fichier d'une page web (HTML). Il faut l'URL du fichier brut (souvent le mot raw ou un bouton « Download »), sinon Python lit la page au lieu des données.

Le code dépend du réseau

# sans connexion : urllib.request.urlopen(url) # URLError : pas de réseau

Un programme qui lit une URL ne marche que si la connexion et le serveur répondent. Pour une démo ou un examen, garde une copie locale du fichier en secours - et entoure l'appel d'un try / except.

Les données distantes changent

# aujourd'hui : 100 lignes # demain : 120 lignes, ou format modifié

Contrairement à un fichier sur ton disque, une ressource web peut être mise à jour, déplacée ou supprimée sans prévenir. Ne suppose jamais que le contenu sera identique d'une fois à l'autre.