2A.eco - Exercice API SNCF#

Links: notebook, html, python, slides, GitHub

Manipulation d’une API REST, celle de la SNCF est prise comme exemple. Exercices.

from jyquickhelper import add_notebook_menu
add_notebook_menu()

API signifie Application Programming Interface. Le mot le plus important est “interface”, et c’est le mot le plus simple, car nous utilisons tous des interfaces au quotidien. Par exemple une télécommande de la TV. Vous avez un groupe de boutons et interrupteurs qui vous permettent de faire différentes opérations. Vous savez quel bouton correspond à quelle action. Par exemple, vous ne pouvez pas allumer votre TV avec le bouton de volume. Pour que cela marche, vous devez respecter l’interface et interagir avec elle de la façon qui a été prévue lors de sa conception.

Une API est une interface pour les applications. Une API vient presque toujours avec une documentation. La documentation du code est un texte écrit par les développeurs qui rend plus facile l’utilisation du code de cette API. Elle explique comment le code fonctionne, pourquoi il a été écrit d’une certaine façon et pas d’une autre, comment contribuer au projet, et bien plus encore. Lire la documentation est essentiel pour bien intégrer l’API d’une autre plateforme. Et chaque API a sa propre logique de fonctionnement.

Ici, vous allez découvrir l’API de la SNCF qui donne accès à de nombreuses informations liées à la mobilité.

Ici, comme souvent, il s’agit d’une API REST. REST signifie “Representational State Transfer”. Les API REST sont basées sur HTTP, qui signifie Hypertext Transfer Protocol. C’est le protocole au coeur du web. Il définit la communication entre les différentes parties du web. L’échange est basé sur des requêtes client et serveur. Le principe du client-serveur définit les deux entités qui interagissent dans une API REST : un client et un serveur, les mêmes entités qui communiquent sur le web. Un client envoie une requête, et le serveur renvoie une réponse.

Les réponses du serveur pour les API REST peuvent être délivrées dans de multiples formats. JSON (JavaScript Object Notation) est souvent utilisé, mais XML, CSV, ou même RSS sont aussi valables. Ici (comme souvent), il s’agit d’un format JSON.

Partie 0 - modules recommandés et connexion à l’API#

Il vous faudra sûrement les modules suivant :

Créer un login pour vous connecter à l’API de la SNCF https://data.sncf.com/api.

Il est possible de stocker une clé de façon cachée sur votre ordinateur avec le module keyring.

import os
from pyquickhelper.loghelper import get_password
key = get_password("sncf", "ensae_teaching_cs,key")

Requêter une API sans Python#

Pour faire une requếté via l’API SNCF, il “suffit” de passer les bons paramètres dans l’url, au format indiqué par la documentation. Comme souvent, c’est un système clé/valeur : url?key1=value1&key2=value2.

Pour savoir quelles clés et quelles valeurs indiquer : il faut lire la Documentation (la SNCF n’a pas fait sa propre documentation, mais il suffit de remplacer navitia.io par sncf.com dans les exemples donnés).

En réponse à la requête, le serveur renvoie un document JSON (JavaScript Object Notation). Cela ressemble à un dictionnaire Python.

Exemple, aller à : https://api.sncf.com/v1/coverage/sncf/stop_areas (si cela ne fonctionne pas, indiquez votre token de la manière suivante : https://{token}@api.sncf.com/v1/coverage/sncf/stop_areas. Exemple : stop_areas.json.

Enregistrez le résultat dans un fichier texte (au même endroit où vous avez ouvert votre notebook tant qu’à faire), et ajoutez l’extension .json

Manipuler un fichier json en Python#

Nous exliquons ci-dessous comment importer et exporter un fichier json en Python.

import json

with open('stop_areas.json','r') as f:
    data=json.load(f)
data
{'disruptions': [],
 'pagination': {'start_page': 0,
  'items_on_page': 25,
  'items_per_page': 25,
  'total_result': 3029},
 'stop_areas': [{'codes': [{'type': 'CR-CI-CH', 'value': '0080-253914-BV'}],
   'name': 'Saarbrucken-Hbf',
   'links': [],
   'coord': {'lat': '49.24065', 'lon': '6.990968'},
   'label': 'Saarbrucken-Hbf (Saarbrücken)',
   'administrative_regions': [{'insee': '',
     'name': 'Saarbrücken',
     'level': 8,
     'coord': {'lat': '49.23436', 'lon': '6.996379'},
     'label': 'Saarbrücken',
     'id': 'admin:1187159extern',
     'zip_code': ''},
    {'insee': '',
     'name': 'Mitte',
     'level': 9,
     'coord': {'lat': '49.251404', 'lon': '6.99026'},
     'label': 'Mitte',
     'id': 'admin:5432693extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80253914'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-110684-00'}],
   'name': 'Frankfurt-am-Main-Hbf',
   'links': [],
   'coord': {'lat': '50.107216', 'lon': '8.66405'},
   'label': 'Frankfurt-am-Main-Hbf',
   'administrative_regions': [{'insee': '',
     'name': 'Gallus',
     'level': 9,
     'coord': {'lat': '50.103378', 'lon': '8.636285'},
     'label': 'Gallus',
     'id': 'admin:4209936extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80110684'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-140087-BV'}],
   'name': 'Mannheim-Hbf',
   'links': [],
   'coord': {'lat': '49.479714', 'lon': '8.470079'},
   'label': 'Mannheim-Hbf',
   'administrative_regions': [{'insee': '',
     'name': 'Schwetzingerstadt/Oststadt',
     'level': 9,
     'coord': {'lat': '49.48053', 'lon': '8.488332'},
     'label': 'Schwetzingerstadt/Oststadt',
     'id': 'admin:3286571extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80140087'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142281-BV'}],
   'name': 'Karlsruhe-Hbf',
   'links': [],
   'coord': {'lat': '48.99439', 'lon': '8.400254'},
   'label': 'Karlsruhe-Hbf',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80142281'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142778-BV'}],
   'name': 'Baden-Baden',
   'links': [],
   'coord': {'lat': '48.790281', 'lon': '8.191165'},
   'label': 'Baden-Baden',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80142778'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142893-BV'}],
   'name': 'Appenweier',
   'links': [],
   'coord': {'lat': '48.541326', 'lon': '7.973672'},
   'label': 'Appenweier (Appenweier)',
   'administrative_regions': [{'insee': '',
     'name': 'Appenweier',
     'level': 8,
     'coord': {'lat': '48.553204', 'lon': '7.97982'},
     'label': 'Appenweier',
     'id': 'admin:452982extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80142893'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142901-00'}],
   'name': 'Legelshurst',
   'links': [],
   'coord': {'lat': '48.558571', 'lon': '7.913724'},
   'label': 'Legelshurst (Willstätt)',
   'administrative_regions': [{'insee': '',
     'name': 'Willstätt',
     'level': 8,
     'coord': {'lat': '48.550797', 'lon': '7.894595'},
     'label': 'Willstätt',
     'id': 'admin:452980extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80142901'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142919-00'}],
   'name': 'Kork',
   'links': [],
   'coord': {'lat': '48.570017', 'lon': '7.874009'},
   'label': 'Kork (Kehl)',
   'administrative_regions': [{'insee': '',
     'name': 'Kehl',
     'level': 8,
     'coord': {'lat': '48.573151', 'lon': '7.811103'},
     'label': 'Kehl',
     'id': 'admin:452979extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80142919'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-021402-BV'}],
   'name': 'Augsburg-Hbf',
   'links': [],
   'coord': {'lat': '48.365581', 'lon': '10.886756'},
   'label': 'Augsburg-Hbf',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80021402'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0071-793158-BV'}],
   'name': 'Port-Bou',
   'links': [],
   'coord': {'lat': '42.424467', 'lon': '3.15786'},
   'label': 'Port-Bou (Portbou)',
   'administrative_regions': [{'insee': '',
     'name': 'Portbou',
     'level': 8,
     'coord': {'lat': '42.427444', 'lon': '3.158865'},
     'label': 'Portbou',
     'id': 'admin:345217extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:71793150'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0087-677914-WE'}],
   'name': 'Irun',
   'links': [],
   'coord': {'lat': '43.339432', 'lon': '-1.801337'},
   'label': 'Irun (Irun)',
   'administrative_regions': [{'insee': '',
     'name': 'Irun',
     'level': 8,
     'coord': {'lat': '43.338318', 'lon': '-1.788809'},
     'label': 'Irun',
     'id': 'admin:346782extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:71116000'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251819-BV'}],
   'name': 'Trier-Hbf',
   'links': [],
   'coord': {'lat': '49.756761', 'lon': '6.652361'},
   'label': 'Trier-Hbf',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80251819'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251850-BV'}],
   'name': 'Konz-Mitte',
   'links': [],
   'coord': {'lat': '0.0', 'lon': '0.0'},
   'label': 'Konz-Mitte',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80251850'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251967-BV'}],
   'name': 'Perl',
   'links': [],
   'coord': {'lat': '0.0', 'lon': '0.0'},
   'label': 'Perl',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80251967'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0087-113209-BV'}],
   'name': 'Pantin',
   'links': [],
   'coord': {'lat': '48.897776', 'lon': '2.400426'},
   'label': 'Pantin (Pantin)',
   'administrative_regions': [{'insee': '93055',
     'name': 'Pantin',
     'level': 8,
     'coord': {'lat': '48.896503', 'lon': '2.40198'},
     'label': 'Pantin (93500)',
     'id': 'admin:67685extern',
     'zip_code': '93500'}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:87113209'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-290346-BV'}],
   'name': 'Stuttgart',
   'links': [],
   'coord': {'lat': '48.783622', 'lon': '9.180496'},
   'label': 'Stuttgart',
   'administrative_regions': [{'insee': '',
     'name': 'Stuttgart-Mitte',
     'level': 9,
     'coord': {'lat': '48.77924', 'lon': '9.181115'},
     'label': 'Stuttgart-Mitte',
     'id': 'admin:1107850extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80290346'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194035-BV'}],
   'name': 'Neustadt (Weinstr) Hbf',
   'links': [],
   'coord': {'lat': '49.350034', 'lon': '8.140647'},
   'label': 'Neustadt (Weinstr) Hbf',
   'administrative_regions': [{'insee': '',
     'name': 'Neustadt-Stadtmitte',
     'level': 9,
     'coord': {'lat': '49.352497', 'lon': '8.117826'},
     'label': 'Neustadt-Stadtmitte',
     'id': 'admin:456995extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80194035'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194258-BV'}],
   'name': 'Landau Hbf',
   'links': [],
   'coord': {'lat': '49.1976', 'lon': '8.12557'},
   'label': 'Landau Hbf',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80194258'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0083-002451-00'}],
   'name': 'Vercelli',
   'links': [],
   'coord': {'lat': '45.329112', 'lon': '8.414824'},
   'label': 'Vercelli (Vercelli)',
   'administrative_regions': [{'insee': '',
     'name': 'Vercelli',
     'level': 8,
     'coord': {'lat': '45.325153', 'lon': '8.422766'},
     'label': 'Vercelli (13100)',
     'id': 'admin:1552703extern',
     'zip_code': '13100'}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:83002451'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194324-BV'}],
   'name': 'WINDEN PFALZ',
   'links': [],
   'coord': {'lat': '49.095415', 'lon': '8.122376'},
   'label': 'WINDEN PFALZ (Winden)',
   'administrative_regions': [{'insee': '',
     'name': 'Winden',
     'level': 8,
     'coord': {'lat': '49.094616', 'lon': '8.11692'},
     'label': 'Winden',
     'id': 'admin:1250497extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80194324'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-196980-BV'}],
   'name': 'Kaiserslautern-Hbf',
   'links': [],
   'coord': {'lat': '49.43628', 'lon': '7.768563'},
   'label': 'Kaiserslautern-Hbf',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80196980'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-203471-00'}],
   'name': 'Munchen-Hbf',
   'links': [],
   'coord': {'lat': '48.140325', 'lon': '11.560415'},
   'label': 'Munchen-Hbf',
   'administrative_regions': [{'insee': '',
     'name': 'Stadtbezirk 02 Ludwigsvorstadt-Isarvorstadt',
     'level': 9,
     'coord': {'lat': '48.13073', 'lon': '11.561022'},
     'label': 'Stadtbezirk 02 Ludwigsvorstadt-Isarvorstadt',
     'id': 'admin:54392extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80203471'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0087-212910-WD'}],
   'name': 'Kehl',
   'links': [],
   'coord': {'lat': '48.576486', 'lon': '7.808005'},
   'label': 'Kehl (Kehl)',
   'administrative_regions': [{'insee': '',
     'name': 'Kehl',
     'level': 8,
     'coord': {'lat': '48.573151', 'lon': '7.811103'},
     'label': 'Kehl',
     'id': 'admin:452979extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80142927'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-143099-BV'}],
   'name': 'Offenburg',
   'links': [],
   'coord': {'lat': '48.476447', 'lon': '7.946696'},
   'label': 'Offenburg (Offenburg)',
   'administrative_regions': [{'insee': '',
     'name': 'Offenburg',
     'level': 8,
     'coord': {'lat': '48.471657', 'lon': '7.944377'},
     'label': 'Offenburg',
     'id': 'admin:452988extern',
     'zip_code': ''}],
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80143099'},
  {'codes': [{'type': 'CR-CI-CH', 'value': '0080-143503-BV'}],
   'name': 'Freiburg-Breisgau',
   'links': [],
   'coord': {'lat': '47.997776', 'lon': '7.841564'},
   'label': 'Freiburg-Breisgau',
   'timezone': 'Europe/Paris',
   'id': 'stop_area:OCE:SA:80143503'}],
 'links': [{'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}',
   'type': 'stop_areas',
   'rel': 'stop_areas',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/route_schedules',
   'type': 'route_schedules',
   'rel': 'route_schedules',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/stop_schedules',
   'type': 'stop_schedules',
   'rel': 'stop_schedules',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/arrivals',
   'type': 'arrivals',
   'rel': 'arrivals',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/departures',
   'type': 'departures',
   'rel': 'departures',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/places_nearby',
   'type': 'places_nearby',
   'rel': 'places_nearby',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/journeys',
   'type': 'journey',
   'rel': 'journeys',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/traffic_reports',
   'type': 'disruption',
   'rel': 'disruptions',
   'templated': True},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1',
   'type': 'next',
   'templated': False},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=121.12',
   'type': 'last',
   'templated': False},
  {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas',
   'type': 'first',
   'templated': False}]}

Ce n’est pas très lisible. Utilisez le module pretty print.

import pprint

pprint.pprint(data)
{'disruptions': [],
 'links': [{'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}',
            'rel': 'stop_areas',
            'templated': True,
            'type': 'stop_areas'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/route_schedules',
            'rel': 'route_schedules',
            'templated': True,
            'type': 'route_schedules'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/stop_schedules',
            'rel': 'stop_schedules',
            'templated': True,
            'type': 'stop_schedules'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/arrivals',
            'rel': 'arrivals',
            'templated': True,
            'type': 'arrivals'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/departures',
            'rel': 'departures',
            'templated': True,
            'type': 'departures'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/places_nearby',
            'rel': 'places_nearby',
            'templated': True,
            'type': 'places_nearby'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/journeys',
            'rel': 'journeys',
            'templated': True,
            'type': 'journey'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/traffic_reports',
            'rel': 'disruptions',
            'templated': True,
            'type': 'disruption'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1',
            'templated': False,
            'type': 'next'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=121.12',
            'templated': False,
            'type': 'last'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas',
            'templated': False,
            'type': 'first'}],
 'pagination': {'items_on_page': 25,
                'items_per_page': 25,
                'start_page': 0,
                'total_result': 3029},
 'stop_areas': [{'administrative_regions': [{'coord': {'lat': '49.23436',
                                                       'lon': '6.996379'},
                                             'id': 'admin:1187159extern',
                                             'insee': '',
                                             'label': 'Saarbrücken',
                                             'level': 8,
                                             'name': 'Saarbrücken',
                                             'zip_code': ''},
                                            {'coord': {'lat': '49.251404',
                                                       'lon': '6.99026'},
                                             'id': 'admin:5432693extern',
                                             'insee': '',
                                             'label': 'Mitte',
                                             'level': 9,
                                             'name': 'Mitte',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-253914-BV'}],
                 'coord': {'lat': '49.24065', 'lon': '6.990968'},
                 'id': 'stop_area:OCE:SA:80253914',
                 'label': 'Saarbrucken-Hbf (Saarbrücken)',
                 'links': [],
                 'name': 'Saarbrucken-Hbf',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '50.103378',
                                                       'lon': '8.636285'},
                                             'id': 'admin:4209936extern',
                                             'insee': '',
                                             'label': 'Gallus',
                                             'level': 9,
                                             'name': 'Gallus',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-110684-00'}],
                 'coord': {'lat': '50.107216', 'lon': '8.66405'},
                 'id': 'stop_area:OCE:SA:80110684',
                 'label': 'Frankfurt-am-Main-Hbf',
                 'links': [],
                 'name': 'Frankfurt-am-Main-Hbf',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.48053',
                                                       'lon': '8.488332'},
                                             'id': 'admin:3286571extern',
                                             'insee': '',
                                             'label': 'Schwetzingerstadt/Oststadt',
                                             'level': 9,
                                             'name': 'Schwetzingerstadt/Oststadt',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-140087-BV'}],
                 'coord': {'lat': '49.479714', 'lon': '8.470079'},
                 'id': 'stop_area:OCE:SA:80140087',
                 'label': 'Mannheim-Hbf',
                 'links': [],
                 'name': 'Mannheim-Hbf',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142281-BV'}],
                 'coord': {'lat': '48.99439', 'lon': '8.400254'},
                 'id': 'stop_area:OCE:SA:80142281',
                 'label': 'Karlsruhe-Hbf',
                 'links': [],
                 'name': 'Karlsruhe-Hbf',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142778-BV'}],
                 'coord': {'lat': '48.790281', 'lon': '8.191165'},
                 'id': 'stop_area:OCE:SA:80142778',
                 'label': 'Baden-Baden',
                 'links': [],
                 'name': 'Baden-Baden',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.553204',
                                                       'lon': '7.97982'},
                                             'id': 'admin:452982extern',
                                             'insee': '',
                                             'label': 'Appenweier',
                                             'level': 8,
                                             'name': 'Appenweier',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-142893-BV'}],
                 'coord': {'lat': '48.541326', 'lon': '7.973672'},
                 'id': 'stop_area:OCE:SA:80142893',
                 'label': 'Appenweier (Appenweier)',
                 'links': [],
                 'name': 'Appenweier',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.550797',
                                                       'lon': '7.894595'},
                                             'id': 'admin:452980extern',
                                             'insee': '',
                                             'label': 'Willstätt',
                                             'level': 8,
                                             'name': 'Willstätt',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-142901-00'}],
                 'coord': {'lat': '48.558571', 'lon': '7.913724'},
                 'id': 'stop_area:OCE:SA:80142901',
                 'label': 'Legelshurst (Willstätt)',
                 'links': [],
                 'name': 'Legelshurst',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.573151',
                                                       'lon': '7.811103'},
                                             'id': 'admin:452979extern',
                                             'insee': '',
                                             'label': 'Kehl',
                                             'level': 8,
                                             'name': 'Kehl',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-142919-00'}],
                 'coord': {'lat': '48.570017', 'lon': '7.874009'},
                 'id': 'stop_area:OCE:SA:80142919',
                 'label': 'Kork (Kehl)',
                 'links': [],
                 'name': 'Kork',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-021402-BV'}],
                 'coord': {'lat': '48.365581', 'lon': '10.886756'},
                 'id': 'stop_area:OCE:SA:80021402',
                 'label': 'Augsburg-Hbf',
                 'links': [],
                 'name': 'Augsburg-Hbf',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '42.427444',
                                                       'lon': '3.158865'},
                                             'id': 'admin:345217extern',
                                             'insee': '',
                                             'label': 'Portbou',
                                             'level': 8,
                                             'name': 'Portbou',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0071-793158-BV'}],
                 'coord': {'lat': '42.424467', 'lon': '3.15786'},
                 'id': 'stop_area:OCE:SA:71793150',
                 'label': 'Port-Bou (Portbou)',
                 'links': [],
                 'name': 'Port-Bou',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '43.338318',
                                                       'lon': '-1.788809'},
                                             'id': 'admin:346782extern',
                                             'insee': '',
                                             'label': 'Irun',
                                             'level': 8,
                                             'name': 'Irun',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-677914-WE'}],
                 'coord': {'lat': '43.339432', 'lon': '-1.801337'},
                 'id': 'stop_area:OCE:SA:71116000',
                 'label': 'Irun (Irun)',
                 'links': [],
                 'name': 'Irun',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251819-BV'}],
                 'coord': {'lat': '49.756761', 'lon': '6.652361'},
                 'id': 'stop_area:OCE:SA:80251819',
                 'label': 'Trier-Hbf',
                 'links': [],
                 'name': 'Trier-Hbf',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251850-BV'}],
                 'coord': {'lat': '0.0', 'lon': '0.0'},
                 'id': 'stop_area:OCE:SA:80251850',
                 'label': 'Konz-Mitte',
                 'links': [],
                 'name': 'Konz-Mitte',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251967-BV'}],
                 'coord': {'lat': '0.0', 'lon': '0.0'},
                 'id': 'stop_area:OCE:SA:80251967',
                 'label': 'Perl',
                 'links': [],
                 'name': 'Perl',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.896503',
                                                       'lon': '2.40198'},
                                             'id': 'admin:67685extern',
                                             'insee': '93055',
                                             'label': 'Pantin (93500)',
                                             'level': 8,
                                             'name': 'Pantin',
                                             'zip_code': '93500'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-113209-BV'}],
                 'coord': {'lat': '48.897776', 'lon': '2.400426'},
                 'id': 'stop_area:OCE:SA:87113209',
                 'label': 'Pantin (Pantin)',
                 'links': [],
                 'name': 'Pantin',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.77924',
                                                       'lon': '9.181115'},
                                             'id': 'admin:1107850extern',
                                             'insee': '',
                                             'label': 'Stuttgart-Mitte',
                                             'level': 9,
                                             'name': 'Stuttgart-Mitte',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-290346-BV'}],
                 'coord': {'lat': '48.783622', 'lon': '9.180496'},
                 'id': 'stop_area:OCE:SA:80290346',
                 'label': 'Stuttgart',
                 'links': [],
                 'name': 'Stuttgart',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.352497',
                                                       'lon': '8.117826'},
                                             'id': 'admin:456995extern',
                                             'insee': '',
                                             'label': 'Neustadt-Stadtmitte',
                                             'level': 9,
                                             'name': 'Neustadt-Stadtmitte',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-194035-BV'}],
                 'coord': {'lat': '49.350034', 'lon': '8.140647'},
                 'id': 'stop_area:OCE:SA:80194035',
                 'label': 'Neustadt (Weinstr) Hbf',
                 'links': [],
                 'name': 'Neustadt (Weinstr) Hbf',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194258-BV'}],
                 'coord': {'lat': '49.1976', 'lon': '8.12557'},
                 'id': 'stop_area:OCE:SA:80194258',
                 'label': 'Landau Hbf',
                 'links': [],
                 'name': 'Landau Hbf',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '45.325153',
                                                       'lon': '8.422766'},
                                             'id': 'admin:1552703extern',
                                             'insee': '',
                                             'label': 'Vercelli (13100)',
                                             'level': 8,
                                             'name': 'Vercelli',
                                             'zip_code': '13100'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0083-002451-00'}],
                 'coord': {'lat': '45.329112', 'lon': '8.414824'},
                 'id': 'stop_area:OCE:SA:83002451',
                 'label': 'Vercelli (Vercelli)',
                 'links': [],
                 'name': 'Vercelli',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.094616',
                                                       'lon': '8.11692'},
                                             'id': 'admin:1250497extern',
                                             'insee': '',
                                             'label': 'Winden',
                                             'level': 8,
                                             'name': 'Winden',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-194324-BV'}],
                 'coord': {'lat': '49.095415', 'lon': '8.122376'},
                 'id': 'stop_area:OCE:SA:80194324',
                 'label': 'WINDEN PFALZ (Winden)',
                 'links': [],
                 'name': 'WINDEN PFALZ',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-196980-BV'}],
                 'coord': {'lat': '49.43628', 'lon': '7.768563'},
                 'id': 'stop_area:OCE:SA:80196980',
                 'label': 'Kaiserslautern-Hbf',
                 'links': [],
                 'name': 'Kaiserslautern-Hbf',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.13073',
                                                       'lon': '11.561022'},
                                             'id': 'admin:54392extern',
                                             'insee': '',
                                             'label': 'Stadtbezirk 02 '
                                                      'Ludwigsvorstadt-Isarvorstadt',
                                             'level': 9,
                                             'name': 'Stadtbezirk 02 '
                                                     'Ludwigsvorstadt-Isarvorstadt',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-203471-00'}],
                 'coord': {'lat': '48.140325', 'lon': '11.560415'},
                 'id': 'stop_area:OCE:SA:80203471',
                 'label': 'Munchen-Hbf',
                 'links': [],
                 'name': 'Munchen-Hbf',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.573151',
                                                       'lon': '7.811103'},
                                             'id': 'admin:452979extern',
                                             'insee': '',
                                             'label': 'Kehl',
                                             'level': 8,
                                             'name': 'Kehl',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-212910-WD'}],
                 'coord': {'lat': '48.576486', 'lon': '7.808005'},
                 'id': 'stop_area:OCE:SA:80142927',
                 'label': 'Kehl (Kehl)',
                 'links': [],
                 'name': 'Kehl',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.471657',
                                                       'lon': '7.944377'},
                                             'id': 'admin:452988extern',
                                             'insee': '',
                                             'label': 'Offenburg',
                                             'level': 8,
                                             'name': 'Offenburg',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-143099-BV'}],
                 'coord': {'lat': '48.476447', 'lon': '7.946696'},
                 'id': 'stop_area:OCE:SA:80143099',
                 'label': 'Offenburg (Offenburg)',
                 'links': [],
                 'name': 'Offenburg',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'CR-CI-CH', 'value': '0080-143503-BV'}],
                 'coord': {'lat': '47.997776', 'lon': '7.841564'},
                 'id': 'stop_area:OCE:SA:80143503',
                 'label': 'Freiburg-Breisgau',
                 'links': [],
                 'name': 'Freiburg-Breisgau',
                 'timezone': 'Europe/Paris'}]}

Avec du javascript.

from jyquickhelper import JSONJS
JSONJS(data)

Pour exporter des données en json

with open('./data_export.json','w') as f:
    json.dump(data,f)

Il est aussi possible de passer par une chaine de caractères. Exemple :

import json

data = {
    'name' : 'Mewtwo',
    'pokedex_id' : 150,
    'type' : 'psychic',
    'location':None,
    'best':True
}

#L'encoding JSON gère les types None, bool, int, float, str, lists, tuples et dictionaires.
#L'encoding presque identique à celui de Python, à quelques différences près :
#None <-> null
#True <-> true
#False <-> false

json_str=json.dumps(data)
print("JSON :", json_str)

data= json.loads(json_str)
print("DATA :", data)
JSON : {"name": "Mewtwo", "pokedex_id": 150, "type": "psychic", "location": null, "best": true}
DATA : {'name': 'Mewtwo', 'pokedex_id': 150, 'type': 'psychic', 'location': None, 'best': True}

Il est possible de trier les clés d’un JSON.

print(json.dumps(data,sort_keys=True))
{"best": true, "location": null, "name": "Mewtwo", "pokedex_id": 150, "type": "psychic"}

Requêter une API avec Python#

import requests
import pprint

#token_auth='votre token ici, recu dans votre boite mail'
token_auth=key

url_avec_params='https://api.sncf.com/v1/coverage/sncf/stop_areas'

r=requests.get(url_avec_params,auth=(token_auth,''))

pprint.pprint(r.json())
{'context': {'current_datetime': '20221207T105949', 'timezone': 'Europe/Paris'},
 'disruptions': [],
 'feed_publishers': [{'id': 'sncf',
                      'license': 'Private (unspecified)',
                      'name': 'SNCF PIV Production',
                      'url': ''},
                     {'id': 'SNCF:sncf-piv',
                      'license': 'Private (unspecified)',
                      'name': 'SNCF PIV Production',
                      'url': ''}],
 'links': [{'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}',
            'rel': 'stop_areas',
            'templated': True,
            'type': 'stop_areas'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/route_schedules',
            'rel': 'route_schedules',
            'templated': True,
            'type': 'route_schedules'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/stop_schedules',
            'rel': 'stop_schedules',
            'templated': True,
            'type': 'stop_schedules'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/arrivals',
            'rel': 'arrivals',
            'templated': True,
            'type': 'arrivals'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/departures',
            'rel': 'departures',
            'templated': True,
            'type': 'departures'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/places_nearby',
            'rel': 'places_nearby',
            'templated': True,
            'type': 'places_nearby'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/journeys',
            'rel': 'journeys',
            'templated': True,
            'type': 'journey'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/traffic_reports',
            'rel': 'disruptions',
            'templated': True,
            'type': 'disruption'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1',
            'templated': False,
            'type': 'next'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=196',
            'templated': False,
            'type': 'last'},
           {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas',
            'templated': False,
            'type': 'first'}],
 'pagination': {'items_on_page': 25,
                'items_per_page': 25,
                'start_page': 0,
                'total_result': 4920},
 'stop_areas': [{'codes': [{'type': 'secondary_id', 'value': 'SNCF:80194209'},
                           {'type': 'secondary_id', 'value': 'SNCF:80194225'},
                           {'type': 'secondary_id', 'value': 'SNCF:80194233'},
                           {'type': 'secondary_id', 'value': 'SNCF:80194332'},
                           {'type': 'secondary_id', 'value': 'SNCF:80197871'},
                           {'type': 'secondary_id', 'value': 'SNCF:80359331'},
                           {'type': 'secondary_id', 'value': 'SNCF:80359349'},
                           {'type': 'secondary_id', 'value': 'SNCF:85010017'},
                           {'type': 'secondary_id', 'value': 'SNCF:87641241'},
                           {'type': 'secondary_id', 'value': 'SNCF:87688051'},
                           {'type': 'secondary_id', 'value': 'SNCF:87713743'},
                           {'type': 'secondary_id', 'value': 'SNCF:87713875'},
                           {'type': 'secondary_id', 'value': 'SNCF:87714097'},
                           {'type': 'secondary_id', 'value': 'SNCF:87757005'},
                           {'type': 'source', 'value': '80194209'},
                           {'type': 'source', 'value': '80194225'},
                           {'type': 'source', 'value': '80194233'},
                           {'type': 'source', 'value': '80194332'},
                           {'type': 'source', 'value': '80197871'},
                           {'type': 'source', 'value': '80359331'},
                           {'type': 'source', 'value': '80359349'},
                           {'type': 'source', 'value': '85010017'},
                           {'type': 'source', 'value': '87407536'},
                           {'type': 'source', 'value': '87641241'},
                           {'type': 'source', 'value': '87688051'},
                           {'type': 'source', 'value': '87713743'},
                           {'type': 'source', 'value': '87713875'},
                           {'type': 'source', 'value': '87714097'},
                           {'type': 'source', 'value': '87757005'}],
                 'coord': {'lat': '0', 'lon': '0'},
                 'id': 'stop_area:SNCF:87407536',
                 'label': '',
                 'links': [],
                 'name': '',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.6977145',
                                                       'lon': '1.7646826'},
                                             'id': 'admin:fr:60001',
                                             'insee': '60001',
                                             'label': 'Abancourt (60220)',
                                             'level': 8,
                                             'name': 'Abancourt',
                                             'zip_code': '60220'}],
                 'codes': [{'type': 'source', 'value': '87313759'},
                           {'type': 'uic', 'value': '87313759'}],
                 'coord': {'lat': '49.685621', 'lon': '1.774297'},
                 'id': 'stop_area:SNCF:87313759',
                 'label': 'Abancourt (Abancourt)',
                 'links': [],
                 'name': 'Abancourt',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '47.5525545',
                                                       'lon': '-1.5322775'},
                                             'id': 'admin:fr:44001',
                                             'insee': '44001',
                                             'label': 'Abbaretz (44170)',
                                             'level': 8,
                                             'name': 'Abbaretz',
                                             'zip_code': '44170'}],
                 'codes': [{'type': 'source', 'value': '87481614'},
                           {'type': 'uic', 'value': '87481614'}],
                 'coord': {'lat': '47.555241', 'lon': '-1.524289'},
                 'id': 'stop_area:SNCF:87481614',
                 'label': 'Abbaretz (Abbaretz)',
                 'links': [],
                 'name': 'Abbaretz',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '50.1060835',
                                                       'lon': '1.8337029'},
                                             'id': 'admin:fr:80001',
                                             'insee': '80001',
                                             'label': 'Abbeville (80100)',
                                             'level': 8,
                                             'name': 'Abbeville',
                                             'zip_code': '80100'}],
                 'codes': [{'type': 'source', 'value': '87317362'},
                           {'type': 'uic', 'value': '87317362'}],
                 'coord': {'lat': '50.102175', 'lon': '1.824538'},
                 'id': 'stop_area:SNCF:87317362',
                 'label': 'Abbeville (Abbeville)',
                 'links': [],
                 'name': 'Abbeville',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.7247582',
                                                       'lon': '2.421509'},
                                             'id': 'admin:fr:94001',
                                             'insee': '94001',
                                             'label': 'Ablon-sur-Seine (94480)',
                                             'level': 8,
                                             'name': 'Ablon-sur-Seine',
                                             'zip_code': '94480'}],
                 'codes': [{'type': 'source', 'value': '87545269'},
                           {'type': 'uic', 'value': '87545269'}],
                 'coord': {'lat': '48.725443', 'lon': '2.419213'},
                 'id': 'stop_area:SNCF:87545269',
                 'label': 'Ablon (Ablon-sur-Seine)',
                 'links': [],
                 'name': 'Ablon',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.7247582',
                                                       'lon': '2.421509'},
                                             'id': 'admin:fr:94001',
                                             'insee': '94001',
                                             'label': 'Ablon-sur-Seine (94480)',
                                             'level': 8,
                                             'name': 'Ablon-sur-Seine',
                                             'zip_code': '94480'}],
                 'codes': [{'type': 'source', 'value': '87590588'},
                           {'type': 'uic', 'value': '87590588'}],
                 'coord': {'lat': '48.72551', 'lon': '2.419155'},
                 'id': 'stop_area:SNCF:87590588',
                 'label': 'Ablon Noctilien (Ablon-sur-Seine)',
                 'links': [],
                 'name': 'Ablon Noctilien',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.2602817',
                                                       'lon': '6.3463759'},
                                             'id': 'admin:fr:57001',
                                             'insee': '57001',
                                             'label': 'Aboncourt (57920)',
                                             'level': 8,
                                             'name': 'Aboncourt',
                                             'zip_code': '57920'}],
                 'codes': [{'type': 'source', 'value': '87191403'},
                           {'type': 'uic', 'value': '87191403'}],
                 'coord': {'lat': '49.261076', 'lon': '6.346603'},
                 'id': 'stop_area:SNCF:87191403',
                 'label': 'Aboncourt Mairie (Aboncourt)',
                 'links': [],
                 'name': 'Aboncourt Mairie',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '46.0980139',
                                                       'lon': '3.4450434'},
                                             'id': 'admin:fr:03001',
                                             'insee': '03001',
                                             'label': 'Abrest (03200)',
                                             'level': 8,
                                             'name': 'Abrest',
                                             'zip_code': '03200'}],
                 'codes': [{'type': 'source', 'value': '87721944'},
                           {'type': 'uic', 'value': '87721944'}],
                 'coord': {'lat': '46.098868', 'lon': '3.444791'},
                 'id': 'stop_area:SNCF:87721944',
                 'label': 'Abrest Mairie (Abrest)',
                 'links': [],
                 'name': 'Abrest Mairie',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '47.6839847',
                                                       'lon': '3.6898895'},
                                             'id': 'admin:fr:89130',
                                             'insee': '89130',
                                             'label': 'Deux Rivières (89460)',
                                             'level': 8,
                                             'name': 'Deux Rivières',
                                             'zip_code': '89460'}],
                 'codes': [{'type': 'source', 'value': '87677252'},
                           {'type': 'uic', 'value': '87677252'}],
                 'coord': {'lat': '47.663798', 'lon': '3.709584'},
                 'id': 'stop_area:SNCF:87677252',
                 'label': 'Accolay Le Pont (Deux Rivières)',
                 'links': [],
                 'name': 'Accolay Le Pont',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.8990413',
                                                       'lon': '2.0942792'},
                                             'id': 'admin:fr:78551',
                                             'insee': '78551',
                                             'label': 'Saint-Germain-en-Laye '
                                                      '(78100-78112)',
                                             'level': 8,
                                             'name': 'Saint-Germain-en-Laye',
                                             'zip_code': '78100;78112'}],
                 'codes': [{'type': 'source', 'value': '87386052'},
                           {'type': 'uic', 'value': '87386052'}],
                 'coord': {'lat': '48.955187', 'lon': '2.091962'},
                 'id': 'stop_area:SNCF:87386052',
                 'label': 'Achères Grand Cormier (Saint-Germain-en-Laye)',
                 'links': [],
                 'name': 'Achères Grand Cormier',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.8990413',
                                                       'lon': '2.0942792'},
                                             'id': 'admin:fr:78551',
                                             'insee': '78551',
                                             'label': 'Saint-Germain-en-Laye '
                                                      '(78100-78112)',
                                             'level': 8,
                                             'name': 'Saint-Germain-en-Laye',
                                             'zip_code': '78100;78112'}],
                 'codes': [{'type': 'source', 'value': '87612978'},
                           {'type': 'uic', 'value': '87612978'}],
                 'coord': {'lat': '48.955143', 'lon': '2.091769'},
                 'id': 'stop_area:SNCF:87612978',
                 'label': 'Acheres Grand Cormier Noctilien '
                          '(Saint-Germain-en-Laye)',
                 'links': [],
                 'name': 'Acheres Grand Cormier Noctilien',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.9606321',
                                                       'lon': '2.0698106'},
                                             'id': 'admin:fr:78005',
                                             'insee': '78005',
                                             'label': 'Achères (78260)',
                                             'level': 8,
                                             'name': 'Achères',
                                             'zip_code': '78260'}],
                 'codes': [{'type': 'source', 'value': '87381657'},
                           {'type': 'uic', 'value': '87381657'}],
                 'coord': {'lat': '48.97011', 'lon': '2.07739'},
                 'id': 'stop_area:SNCF:87381657',
                 'label': 'Achères Ville (Achères)',
                 'links': [],
                 'name': 'Achères Ville',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.9606321',
                                                       'lon': '2.0698106'},
                                             'id': 'admin:fr:78005',
                                             'insee': '78005',
                                             'label': 'Achères (78260)',
                                             'level': 8,
                                             'name': 'Achères',
                                             'zip_code': '78260'}],
                 'codes': [{'type': 'source', 'value': '87605444'},
                           {'type': 'uic', 'value': '87605444'}],
                 'coord': {'lat': '48.96983', 'lon': '2.077253'},
                 'id': 'stop_area:SNCF:87605444',
                 'label': 'Acheres-Ville Noctilien (Achères)',
                 'links': [],
                 'name': 'Acheres-Ville Noctilien',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '50.1320114',
                                                       'lon': '2.7843609'},
                                             'id': 'admin:fr:62005',
                                             'insee': '62005',
                                             'label': 'Achiet-le-Grand (62121)',
                                             'level': 8,
                                             'name': 'Achiet-le-Grand',
                                             'zip_code': '62121'}],
                 'codes': [{'type': 'source', 'value': '87342048'},
                           {'type': 'uic', 'value': '87342048'}],
                 'coord': {'lat': '50.131919', 'lon': '2.780112'},
                 'id': 'stop_area:SNCF:87342048',
                 'label': 'Achiet (Achiet-le-Grand)',
                 'links': [],
                 'name': 'Achiet',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.5567206',
                                                       'lon': '1.9790338'},
                                             'id': 'admin:fr:60004',
                                             'insee': '60004',
                                             'label': 'Achy (60690)',
                                             'level': 8,
                                             'name': 'Achy',
                                             'zip_code': '60690'}],
                 'codes': [{'type': 'source', 'value': '87316455'},
                           {'type': 'uic', 'value': '87316455'}],
                 'coord': {'lat': '49.55473', 'lon': '1.979053'},
                 'id': 'stop_area:SNCF:87316455',
                 'label': 'Achy (Achy)',
                 'links': [],
                 'name': 'Achy',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.9052331',
                                                       'lon': '7.2036488'},
                                             'id': 'admin:fr:67002',
                                             'insee': '67002',
                                             'label': 'Adamswiller (67320)',
                                             'level': 8,
                                             'name': 'Adamswiller',
                                             'zip_code': '67320'}],
                 'codes': [{'type': 'source', 'value': '87658856'},
                           {'type': 'uic', 'value': '87658856'}],
                 'coord': {'lat': '48.905635', 'lon': '7.208238'},
                 'id': 'stop_area:SNCF:87658856',
                 'label': 'Adamswiller Lotissement la Forêt (Adamswiller)',
                 'links': [],
                 'name': 'Adamswiller Lotissement la Forêt',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.9052331',
                                                       'lon': '7.2036488'},
                                             'id': 'admin:fr:67002',
                                             'insee': '67002',
                                             'label': 'Adamswiller (67320)',
                                             'level': 8,
                                             'name': 'Adamswiller',
                                             'zip_code': '67320'}],
                 'codes': [{'type': 'source', 'value': '87658922'},
                           {'type': 'uic', 'value': '87658922'}],
                 'coord': {'lat': '48.903835', 'lon': '7.201179'},
                 'id': 'stop_area:SNCF:87658922',
                 'label': 'Adamswiller Mairie (Adamswiller)',
                 'links': [],
                 'name': 'Adamswiller Mairie',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.7126093',
                                                       'lon': '2.3637838'},
                                             'id': 'admin:fr:91479',
                                             'insee': '91479',
                                             'label': 'Paray-Vieille-Poste '
                                                      '(91550-94390)',
                                             'level': 8,
                                             'name': 'Paray-Vieille-Poste',
                                             'zip_code': '91550;94390'}],
                 'codes': [{'type': 'source', 'value': '87495713'},
                           {'type': 'uic', 'value': '87495713'}],
                 'coord': {'lat': '48.728337', 'lon': '2.359676'},
                 'id': 'stop_area:SNCF:87495713',
                 'label': 'Aérogare Orly Ouest (Paray-Vieille-Poste)',
                 'links': [],
                 'name': 'Aérogare Orly Ouest',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.7126093',
                                                       'lon': '2.3637838'},
                                             'id': 'admin:fr:91479',
                                             'insee': '91479',
                                             'label': 'Paray-Vieille-Poste '
                                                      '(91550-94390)',
                                             'level': 8,
                                             'name': 'Paray-Vieille-Poste',
                                             'zip_code': '91550;94390'}],
                 'codes': [{'type': 'source', 'value': '87523548'},
                           {'type': 'uic', 'value': '87523548'}],
                 'coord': {'lat': '48.728829', 'lon': '2.369614'},
                 'id': 'stop_area:SNCF:87523548',
                 'label': 'Aérogare Orly Sud (Paray-Vieille-Poste)',
                 'links': [],
                 'name': 'Aérogare Orly Sud',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.98020349999999',
                                                       'lon': '2.5589558'},
                                             'id': 'admin:fr:93073',
                                             'insee': '93073',
                                             'label': 'Tremblay-en-France '
                                                      '(93290)',
                                             'level': 8,
                                             'name': 'Tremblay-en-France',
                                             'zip_code': '93290'}],
                 'codes': [{'type': 'source', 'value': '87271460'},
                           {'type': 'uic', 'value': '87271460'}],
                 'coord': {'lat': '49.00956', 'lon': '2.56135'},
                 'id': 'stop_area:SNCF:87271460',
                 'label': 'Aéroport Charles de Gaulle 1 (Tremblay-en-France)',
                 'links': [],
                 'name': 'Aéroport Charles de Gaulle 1',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.98020349999999',
                                                       'lon': '2.5589558'},
                                             'id': 'admin:fr:93073',
                                             'insee': '93073',
                                             'label': 'Tremblay-en-France '
                                                      '(93290)',
                                             'level': 8,
                                             'name': 'Tremblay-en-France',
                                             'zip_code': '93290'}],
                 'codes': [{'type': 'source', 'value': '87271494'},
                           {'type': 'uic', 'value': '87271494'}],
                 'coord': {'lat': '49.003618', 'lon': '2.570812'},
                 'id': 'stop_area:SNCF:87271494',
                 'label': 'Aéroport Charles de Gaulle 2 TGV '
                          '(Tremblay-en-France)',
                 'links': [],
                 'name': 'Aéroport Charles de Gaulle 2 TGV',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.0332971',
                                                       'lon': '2.5809475'},
                                             'id': 'admin:fr:77282',
                                             'insee': '77282',
                                             'label': 'Mauregard (77990)',
                                             'level': 8,
                                             'name': 'Mauregard',
                                             'zip_code': '77990'}],
                 'codes': [{'type': 'source', 'value': '87994210'},
                           {'type': 'uic', 'value': '87994210'}],
                 'coord': {'lat': '49.013273', 'lon': '2.541919'},
                 'id': 'stop_area:SNCF:87994210',
                 'label': 'Aéroport Charles de Gaulle T1 (Mauregard)',
                 'links': [],
                 'name': 'Aéroport Charles de Gaulle T1',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.0172102',
                                                       'lon': '2.5910318'},
                                             'id': 'admin:fr:77291',
                                             'insee': '77291',
                                             'label': 'Le Mesnil-Amelot '
                                                      '(77990)',
                                             'level': 8,
                                             'name': 'Le Mesnil-Amelot',
                                             'zip_code': '77990'}],
                 'codes': [{'type': 'source', 'value': '87994228'},
                           {'type': 'uic', 'value': '87994228'}],
                 'coord': {'lat': '49.00436', 'lon': '2.571021'},
                 'id': 'stop_area:SNCF:87994228',
                 'label': 'Aéroport Charles de Gaulle T2 (Le Mesnil-Amelot)',
                 'links': [],
                 'name': 'Aéroport Charles de Gaulle T2',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.98020349999999',
                                                       'lon': '2.5589558'},
                                             'id': 'admin:fr:93073',
                                             'insee': '93073',
                                             'label': 'Tremblay-en-France '
                                                      '(93290)',
                                             'level': 8,
                                             'name': 'Tremblay-en-France',
                                             'zip_code': '93290'}],
                 'codes': [{'type': 'source', 'value': '87994152'},
                           {'type': 'uic', 'value': '87994152'}],
                 'coord': {'lat': '49.009976', 'lon': '2.561354'},
                 'id': 'stop_area:SNCF:87994152',
                 'label': 'Aéroport Charles de Gaulle T3 (Tremblay-en-France)',
                 'links': [],
                 'name': 'Aéroport Charles de Gaulle T3',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.98020349999999',
                                                       'lon': '2.5589558'},
                                             'id': 'admin:fr:93073',
                                             'insee': '93073',
                                             'label': 'Tremblay-en-France '
                                                      '(93290)',
                                             'level': 8,
                                             'name': 'Tremblay-en-France',
                                             'zip_code': '93290'}],
                 'codes': [{'type': 'source', 'value': '87001479'},
                           {'type': 'uic', 'value': '87001479'}],
                 'coord': {'lat': '49.003965', 'lon': '2.570665'},
                 'id': 'stop_area:SNCF:87001479',
                 'label': 'Aéroport Charles-de-Gaulle 2 RER '
                          '(Tremblay-en-France)',
                 'links': [],
                 'name': 'Aéroport Charles-de-Gaulle 2 RER',
                 'timezone': 'Europe/Paris'}]}
JSONJS(r.json())

A vous de jouer.

Partie 1 - Trouver les gares accessibles via la SNCF#

  • Trouver l’ensemble des gares disponibles sur l’API et créer un fichier csv avec les codes de la gare, son nom et ses coordonnées latitude et longitude, ainsi que les informations administratives de la région quand elles sont disponibles

  • Représentez les sur un graphique

Les trajets depuis la Gare de Lyon#

Partons à Lyon : le 17 novembre 2016 à 19h57#

Imaginez que vous vouliez un peu voyager hors de Paris, et il se trouve que justement on vous propose de passer quelques jours à Lyon. Vous partez le 17 novembre vers 19h50 pour ne pas trop écourter votre journée de travail.

Question 1#

  • Commencez par récupérer les informations sur le trajet entre Paris Gare de Lyon et Lyon Perrache le 17 novembre à 19h57

    • Paris - Gare de Lyon (code de la gare : stop_area:OCE:SA:87686006)

    • Lyon - Gare Lyon Perrache (code de la gare : stop_area:OCE:SA:87722025)

    • Indice : utiliser la requête “journeys”

    • Autre indice : le format de la date est AAAAMMJJTHHMMSS (Année, mois, jour, heure, minutes, secondes)

  • Répondez aux questions suivantes

    • combien y a-t-il d’arrêts entre ces deux gares ? (utilisez la clé ‘journeys’)

    • combien de temps d’arrêt à chacune d’elles ?

Question 2#

Vous êtes un peu pressé et vous avez peur de vous tromper en arrivant à la gare car d’autres TGV partent à peu près en même temps (à partir de 19h00) de la gare de Lyon.

  • Si vous demandez à l’API, combien de résultats vous donne-t-elle ?

  • Quels sont les horaires de départ de ces trains ?

  • Parmi ces trains, combien de trains ont pour destination finale Lyon et qui partent le 17 novembre ?

C’est quand qu’on va où ?#

  • En fait, vous n’êtes plus très sûr de vouloir aller à Lyon. Mais bon maintenant vous êtes Gare de Lyon et il est 18h00.

Question 3#

  • Combien de tgv partent entre 18h00 et 20h00 ?

  • Lequel arrive le plus tôt à sa destination finale ?

Et les correspondances ?#

Question 4#

  • On va essayer de voir jusqu’où on peut aller, en prenant des trains au départ de la Gare de Lyon :

    • Quelles sont toutes les gares atteignables en partant le 17 novembre, sans faire de changement et sans partir après minuit ?

    • Si on prend un de ces trains, jusqu’où peut-on aller, avec une correspondance, sans partir après 8h le lendemain matin ?

Etape 1 : trouver toutes les correspondances possibles depuis le trajet entre les gares de Paris et de Perpignan#

Essayer de trouver toutes les correspondances possibles depuis un trajet entre Paris et Perpignan

Etape 2 : Généraliser et trouver toutes les correspondances possibles depuis les trains qu’on prend de la Gare de Lyon, le 17 novembre au soir#

Maintenant qu’on a fait un exemple, on le fait pour tous les trajets qui partent de la Gare de Lyon entre 18h et 20h de la Gare de Lyon

Les correspondances elles devront partir avant 8h00 du matin le lendemain

Question 5#

  • Représenter toutes les gares atteignables avec un graphique type scatter. Distinguer les gares atteintes en un seul trajet et celles atteintes avec une correspondance.