Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout

fetch the Internet

JSON

commençons par une donnée en JSON; par exemple ceci src/country-by-population.json
pour trouver le bon lien, je clique sur ‘Raw’ et je copie ici

Il s’agit pour nous d’écrire un code qui va chercher cette donnée et les traduit en une structure Python (à base de list et dict) -
la structure en question est déjà présente dans le JSON.

Indices sur la librairie requests

ce module ne fait pas partie de la librairie standard, il faut l’installer avec .. wait for it

pip install requests

(il y a des fonctions de ce genre dans la librairie standard, mais c’est celle-ci qui est le plus souvent utilisée)

poster la requête

les attributs de l’objet response

['apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']
200
{'Connection': 'keep-alive', 'Content-Length': '3197', 'Cache-Control': 'max-age=300', 'Content-Security-Policy': "default-src 'none'; style-src 'unsafe-inline'; sandbox", 'Content-Type': 'text/plain; charset=utf-8', 'ETag': 'W/"81c9e62269c8660e7bf10f234993c94c4ea4dc2b725e4bd5f2df78505cab71e7"', 'Strict-Transport-Security': 'max-age=31536000', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'deny', 'X-XSS-Protection': '1; mode=block', 'X-GitHub-Request-Id': '1A3C:180EBD:5AEF49:6395DB:6AB64B58', 'x-github-edge-region': 'fra', 'Content-Encoding': 'gzip', 'Accept-Ranges': 'bytes', 'Date': 'Fri, 25 Sep 2026 10:22:16 GMT', 'Via': '1.1 varnish', 'X-Served-By': 'cache-vie6380-VIE', 'X-Cache': 'MISS', 'X-Cache-Hits': '0', 'X-Timer': 'S1790331737.530500,VS0,VE194', 'Vary': 'Authorization,Accept-Encoding', 'Access-Control-Allow-Origin': '*', 'Cross-Origin-Resource-Policy': 'cross-origin', 'X-Fastly-Request-ID': '082ae97eae61ac5e6915704f3e9118564d96fa4a', 'Expires': 'Fri, 25 Sep 2026 10:27:16 GMT', 'Source-Age': '0'}
'3197'
<class 'str'>
[
    {
        "country": "Afghanistan",
        "population": 37172386
    },
    {
        "count ...

indices sur la librairie json

pour le coup, elle est dans la stdlib; les deux méthodes intéressantes sont

le code

du coup le code que je dois écrire pour faire le job est simplement

list
[{'country': 'Afghanistan', 'population': 37172386}, {'country': 'Albania', 'population': 2866376}, {'country': 'Algeria', 'population': 42228429}]
[{'country': 'Yemen', 'population': 28498687}, {'country': 'Zambia', 'population': 17351822}, {'country': 'Zimbabwe', 'population': 14439018}]
244

option: transformer la structure

66977107

CSV

Vous trouverez à cette URL un accès aux données de population par pays data/population.csv

'132261'

indices sur la librairie csv

il se trouve que la librairie csv fournit un objet csv.reader qui prend un paramètre de type file
c’est-à-dire comme par exemple le résultat de open()

ça demande une petite gymnastique, car nous avons le texte en mémoire, et pas dans un fichier...

option 1 - pas beau !

très inélégant, mais qui peut marcher à la rigueur:
j’ai une chaine, je l’écris dans un fichier, que je peux ensuite rouvrir en lecture pour le passer à csv.reader ...
une option viable en dernier recours, mais on ne va pas le faire, car c’est très vilain, et il y a une astuce pour s’en sortir autrement:

option 2 - mieux

exactement pour contourner ce genre de cas, il y a une classe io.StringIO qui, en partant d’une chaine en mémoire, se comporte comme un fichier ! et donc on va utiliser cela :

1 ['Country Name', 'Country Code', 'Year', 'Value']
2 ['Aruba', 'ABW', '1960', '54922']
3 ['Aruba', 'ABW', '1961', '55578']

À ce stade, on voit comment on peut transformer nos données en listes Python; mais on va s’arrêter là, parce qu’en pratique ça c’est vraiment un exercice qu’on ferait en pandas...

un aperçu de pandas

pandas est une librairie externe aussi, qu’il faut absolument connaitre un peu, dès qu’on manipule de la data
et pour commencer il y a une fonction read_csv qui va faire le job complet (acquisition et chargement) en un seul appel:

Loading...
Loading...
Loading...
Loading...
<bound method NDFrame.head of country code population time 1980-01-01 France FRA 55274184 1981-01-01 France FRA 55603353 1982-01-01 France FRA 55806789 1983-01-01 France FRA 56108330 1984-01-01 France FRA 56383085 1985-01-01 France FRA 56665619 1986-01-01 France FRA 56956002 1987-01-01 France FRA 57266167 1988-01-01 France FRA 57598186 1989-01-01 France FRA 57943062 1990-01-01 France FRA 58261012 1991-01-01 France FRA 58554242 1992-01-01 France FRA 58846584 1993-01-01 France FRA 59103094 1994-01-01 France FRA 59324863 1995-01-01 France FRA 59541294 1996-01-01 France FRA 59754504 1997-01-01 France FRA 59968066 1998-01-01 France FRA 60190684 1999-01-01 France FRA 60501986 2000-01-01 France FRA 60918661 2001-01-01 France FRA 61364377 2002-01-01 France FRA 61812142 2003-01-01 France FRA 62249855 2004-01-01 France FRA 62707588 2005-01-01 France FRA 63180854 2006-01-01 France FRA 63622342 2007-01-01 France FRA 64016890 2008-01-01 France FRA 64375116 2009-01-01 France FRA 64706436 2010-01-01 France FRA 65026211>
<Figure size 640x480 with 1 Axes>