2A.eco - Exercice API SNCF

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

In [1]:
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Out[1]:
run previous cell, wait for 2 seconds

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.

In [2]:
import keyring, os
key = keyring.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.

In [3]:
import json

with open('stop_areas.json','r') as f:
    data=json.load(f)
data
Out[3]:
{'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.

In [4]:
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'}]}

Pour exporter des données en json

In [5]:
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 :

In [6]:
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.

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

Requêter une API avec Python

In [8]:
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': '20190304T145237', 'timezone': 'Europe/Paris'},
 'disruptions': [],
 'feed_publishers': [],
 '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=210',
            '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': 5256},
 'stop_areas': [{'codes': [{'type': 'UIC8', 'value': '87142026'},
                           {'type': 'external_code', 'value': 'OCE87142026'}],
                 'coord': {'lat': '0', 'lon': '0'},
                 'id': 'stop_area:OCE:SA:87142026',
                 'label': '',
                 'links': [],
                 'name': '',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '43.028671',
                                                       'lon': '1.607382'},
                                             'id': 'admin:fr:09103',
                                             'insee': '09103',
                                             'label': 'Crampagna (09120)',
                                             'level': 8,
                                             'name': 'Crampagna',
                                             'zip_code': '09120'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-443937-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-443937-00'},
                           {'type': 'UIC8', 'value': '87443937'},
                           {'type': 'external_code', 'value': 'OCE87443937'}],
                 'coord': {'lat': '43.011735', 'lon': '1.608224'},
                 'id': 'stop_area:OCE:SA:87443937',
                 'label': ' (Crampagna)',
                 'links': [],
                 'name': '',
                 'timezone': 'Europe/Paris'},
                {'codes': [{'type': 'UIC8', 'value': '87716829'},
                           {'type': 'external_code', 'value': 'OCE87716829'}],
                 'coord': {'lat': '0', 'lon': '0'},
                 'id': 'stop_area:OCE:SA:87716829',
                 'label': '',
                 'links': [],
                 'name': '',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '50.756966',
                                                       'lon': '6.092983'},
                                             'id': 'admin:osm:22146',
                                             'insee': '',
                                             'label': 'Aachen-Mitte',
                                             'level': 9,
                                             'name': 'Aachen-Mitte',
                                             'zip_code': ''},
                                            {'coord': {'lat': '50.776348',
                                                       'lon': '6.083862'},
                                             'id': 'admin:osm:62564',
                                             'insee': '',
                                             'label': 'Aachen',
                                             'level': 8,
                                             'name': 'Aachen',
                                             'zip_code': ''}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0080-153452-BV'},
                           {'type': 'CR-CI-CH', 'value': '0080-153452-BV'},
                           {'type': 'UIC8', 'value': '80153452'},
                           {'type': 'external_code', 'value': 'OCE80153452'}],
                 'coord': {'lat': '50.767729', 'lon': '6.091261'},
                 'id': 'stop_area:OCE:SA:80153452',
                 'label': 'Aachen/Aix la Chapelle (Aachen)',
                 'links': [],
                 'name': 'Aachen/Aix la Chapelle',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.697716',
                                                       'lon': '1.764682'},
                                             'id': 'admin:fr:60001',
                                             'insee': '60001',
                                             'label': 'Abancourt (60220)',
                                             'level': 8,
                                             'name': 'Abancourt',
                                             'zip_code': '60220'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-313759-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-313759-00'},
                           {'type': 'UIC8', 'value': '87313759'},
                           {'type': 'external_code', 'value': 'OCE87313759'}],
                 'coord': {'lat': '49.685672', 'lon': '1.774195'},
                 'id': 'stop_area:OCE:SA:87313759',
                 'label': 'Abancourt (Abancourt)',
                 'links': [],
                 'name': 'Abancourt',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '47.552555',
                                                       'lon': '-1.532277'},
                                             'id': 'admin:fr:44001',
                                             'insee': '44001',
                                             'label': 'Abbaretz (44170)',
                                             'level': 8,
                                             'name': 'Abbaretz',
                                             'zip_code': '44170'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-481614-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-481614-00'},
                           {'type': 'UIC8', 'value': '87481614'},
                           {'type': 'external_code', 'value': 'OCE87481614'}],
                 'coord': {'lat': '47.555246', 'lon': '-1.524204'},
                 'id': 'stop_area:OCE:SA:87481614',
                 'label': 'Abbaretz (Abbaretz)',
                 'links': [],
                 'name': 'Abbaretz',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '50.106083',
                                                       'lon': '1.833702'},
                                             'id': 'admin:fr:80001',
                                             'insee': '80001',
                                             'label': 'Abbeville (80100)',
                                             'level': 8,
                                             'name': 'Abbeville',
                                             'zip_code': '80100'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-317362-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-317362-00'},
                           {'type': 'UIC8', 'value': '87317362'},
                           {'type': 'external_code', 'value': 'OCE87317362'}],
                 'coord': {'lat': '50.102207', 'lon': '1.824503'},
                 'id': 'stop_area:OCE:SA:87317362',
                 'label': 'Abbeville (Abbeville)',
                 'links': [],
                 'name': 'Abbeville',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.724758',
                                                       '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': 'CR-CI-CH', 'value': '0087-545269-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-545269-00'},
                           {'type': 'UIC8', 'value': '87545269'},
                           {'type': 'external_code', 'value': 'OCE87545269'}],
                 'coord': {'lat': '48.725379', 'lon': '2.419263'},
                 'id': 'stop_area:OCE:SA:87545269',
                 'label': 'Ablon (Ablon-sur-Seine)',
                 'links': [],
                 'name': 'Ablon',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '49.260281',
                                                       'lon': '6.346375'},
                                             'id': 'admin:fr:57001',
                                             'insee': '57001',
                                             'label': 'Aboncourt (57920)',
                                             'level': 8,
                                             'name': 'Aboncourt',
                                             'zip_code': '57920'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-191403-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-191403-00'},
                           {'type': 'UIC8', 'value': '87191403'},
                           {'type': 'external_code', 'value': 'OCE87191403'}],
                 'coord': {'lat': '49.261003', 'lon': '6.34653'},
                 'id': 'stop_area:OCE:SA:87191403',
                 'label': 'Aboncourt (Aboncourt)',
                 'links': [],
                 'name': 'Aboncourt',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '46.098015',
                                                       'lon': '3.445043'},
                                             'id': 'admin:fr:03001',
                                             'insee': '03001',
                                             'label': 'Abrest (03200)',
                                             'level': 8,
                                             'name': 'Abrest',
                                             'zip_code': '03200'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-407494-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-407494-00'},
                           {'type': 'UIC8', 'value': '87407494'},
                           {'type': 'external_code', 'value': 'OCE87407494'}],
                 'coord': {'lat': '46.088871', 'lon': '3.456893'},
                 'id': 'stop_area:OCE:SA:87407494',
                 'label': 'Abrest-les-Dollots (Abrest)',
                 'links': [],
                 'name': 'Abrest-les-Dollots',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '47.66045',
                                                       'lon': '3.709838'},
                                             'id': 'admin:fr:89001',
                                             'insee': '89001',
                                             'label': 'Accolay (89460)',
                                             'level': 9,
                                             'name': 'Accolay',
                                             'zip_code': '89460'},
                                            {'coord': {'lat': '47.683983',
                                                       'lon': '3.689889'},
                                             'id': 'admin:fr:89130',
                                             'insee': '89130',
                                             'label': 'Deux Rivières (89460)',
                                             'level': 8,
                                             'name': 'Deux Rivières',
                                             'zip_code': '89460'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-677252-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-677252-HR'},
                           {'type': 'UIC8', 'value': '87677252'},
                           {'type': 'external_code', 'value': 'OCE87677252'}],
                 'coord': {'lat': '47.659436', 'lon': '3.713927'},
                 'id': 'stop_area:OCE:SA:87677252',
                 'label': 'Accolay-Le-Pont (Deux Rivières)',
                 'links': [],
                 'name': 'Accolay-Le-Pont',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '42.974834',
                                                       'lon': '-0.598767'},
                                             'id': 'admin:fr:64006',
                                             'insee': '64006',
                                             'label': 'Accous (64490)',
                                             'level': 8,
                                             'name': 'Accous',
                                             'zip_code': '64490'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-672782-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-672782-00'},
                           {'type': 'UIC8', 'value': '87672782'},
                           {'type': 'external_code', 'value': 'OCE87672782'}],
                 'coord': {'lat': '42.978305', 'lon': '-0.606693'},
                 'id': 'stop_area:OCE:SA:87672782',
                 'label': 'Accous (Accous)',
                 'links': [],
                 'name': 'Accous',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '50.132011',
                                                       'lon': '2.78436'},
                                             'id': 'admin:fr:62005',
                                             'insee': '62005',
                                             'label': 'Achiet-le-Grand (62121)',
                                             'level': 8,
                                             'name': 'Achiet-le-Grand',
                                             'zip_code': '62121'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-342048-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-342048-00'},
                           {'type': 'UIC8', 'value': '87342048'},
                           {'type': 'external_code', 'value': 'OCE87342048'}],
                 'coord': {'lat': '50.131695', 'lon': '2.780169'},
                 'id': 'stop_area:OCE:SA:87342048',
                 'label': 'Achiet (Achiet-le-Grand)',
                 'links': [],
                 'name': 'Achiet',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.89904',
                                                       'lon': '2.094279'},
                                             'id': 'admin:fr:78551',
                                             'insee': '78551',
                                             'label': 'Saint-Germain-en-Laye '
                                                      '(78100)',
                                             'level': 8,
                                             'name': 'Saint-Germain-en-Laye',
                                             'zip_code': '78100'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-386052-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-386052-00'},
                           {'type': 'UIC8', 'value': '87386052'},
                           {'type': 'external_code', 'value': 'OCE87386052'}],
                 'coord': {'lat': '48.955167', 'lon': '2.091957'},
                 'id': 'stop_area:OCE:SA:87386052',
                 'label': 'Achères-Grand-Cormier (Saint-Germain-en-Laye)',
                 'links': [],
                 'name': 'Achères-Grand-Cormier',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.960266',
                                                       'lon': '2.070164'},
                                             'id': 'admin:fr:78005',
                                             'insee': '78005',
                                             'label': 'Achères (78260)',
                                             'level': 8,
                                             'name': 'Achères',
                                             'zip_code': '78260'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-381657-BV'},
                           {'type': 'CR-CI-CH', 'value': '0087-381657-BV'},
                           {'type': 'UIC8', 'value': '87381657'},
                           {'type': 'external_code', 'value': 'OCE87381657'}],
                 'coord': {'lat': '48.969345', 'lon': '2.077803'},
                 'id': 'stop_area:OCE:SA:87381657',
                 'label': 'Achères-Ville (Achères)',
                 'links': [],
                 'name': 'Achères-Ville',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.905231',
                                                       'lon': '7.203648'},
                                             'id': 'admin:fr:67002',
                                             'insee': '67002',
                                             'label': 'Adamswiller (67320)',
                                             'level': 8,
                                             'name': 'Adamswiller',
                                             'zip_code': '67320'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-658856-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-658856-HR'},
                           {'type': 'UIC8', 'value': '87658856'},
                           {'type': 'external_code', 'value': 'OCE87658856'}],
                 'coord': {'lat': '48.905604', 'lon': '7.208219'},
                 'id': 'stop_area:OCE:SA:87658856',
                 'label': 'Adamswiller Lot. forêt. (Adamswiller)',
                 'links': [],
                 'name': 'Adamswiller Lot. forêt.',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '48.905231',
                                                       'lon': '7.203648'},
                                             'id': 'admin:fr:67002',
                                             'insee': '67002',
                                             'label': 'Adamswiller (67320)',
                                             'level': 8,
                                             'name': 'Adamswiller',
                                             'zip_code': '67320'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-658922-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-658922-HR'},
                           {'type': 'UIC8', 'value': '87658922'},
                           {'type': 'external_code', 'value': 'OCE87658922'}],
                 'coord': {'lat': '48.903822', 'lon': '7.201153'},
                 'id': 'stop_area:OCE:SA:87658922',
                 'label': 'Adamswiller-(Mairie). (Adamswiller)',
                 'links': [],
                 'name': 'Adamswiller-(Mairie).',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '43.425529',
                                                       'lon': '6.769424'},
                                             'id': 'admin:fr:83118',
                                             'insee': '83118',
                                             'label': 'Saint-Raphaël '
                                                      '(83530-83700)',
                                             'level': 8,
                                             'name': 'Saint-Raphaël',
                                             'zip_code': '83530;83700'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-757559-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-757559-00'},
                           {'type': 'UIC8', 'value': '87757559'},
                           {'type': 'external_code', 'value': 'OCE87757559'}],
                 'coord': {'lat': '43.431616', 'lon': '6.856694'},
                 'id': 'stop_area:OCE:SA:87757559',
                 'label': 'Agay (Saint-Raphaël)',
                 'links': [],
                 'name': 'Agay',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '43.312664',
                                                       'lon': '3.471838'},
                                             'id': 'admin:fr:34003',
                                             'insee': '34003',
                                             'label': 'Agde (34300)',
                                             'level': 8,
                                             'name': 'Agde',
                                             'zip_code': '34300'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-781278-00'},
                           {'type': 'CR-CI-CH', 'value': '0087-781278-00'},
                           {'type': 'UIC8', 'value': '87781278'},
                           {'type': 'external_code', 'value': 'OCE87781278'}],
                 'coord': {'lat': '43.317566', 'lon': '3.466029'},
                 'id': 'stop_area:OCE:SA:87781278',
                 'label': 'Agde (Agde)',
                 'links': [],
                 'name': 'Agde',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '44.201561',
                                                       'lon': '0.617632'},
                                             'id': 'admin:fr:47001',
                                             'insee': '47001',
                                             'label': 'Agen (47000)',
                                             'level': 8,
                                             'name': 'Agen',
                                             'zip_code': '47000'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-586008-BV'},
                           {'type': 'CR-CI-CH', 'value': '0087-586008-BV'},
                           {'type': 'UIC8', 'value': '87586008'},
                           {'type': 'external_code', 'value': 'OCE87586008'}],
                 'coord': {'lat': '44.207958', 'lon': '0.620892'},
                 'id': 'stop_area:OCE:SA:87586008',
                 'label': 'Agen (Agen)',
                 'links': [],
                 'name': 'Agen',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '44.201561',
                                                       'lon': '0.617632'},
                                             'id': 'admin:fr:47001',
                                             'insee': '47001',
                                             'label': 'Agen (47000)',
                                             'level': 8,
                                             'name': 'Agen',
                                             'zip_code': '47000'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-465534-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-465534-HR'},
                           {'type': 'UIC8', 'value': '87465534'},
                           {'type': 'external_code', 'value': 'OCE87465534'}],
                 'coord': {'lat': '44.205649', 'lon': '0.634791'},
                 'id': 'stop_area:OCE:SA:87465534',
                 'label': 'Agen-Cimetière (Agen)',
                 'links': [],
                 'name': 'Agen-Cimetière',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '44.23912',
                                                       'lon': '0.64707'},
                                             'id': 'admin:fr:47100',
                                             'insee': '47100',
                                             'label': 'Foulayronnes (47510)',
                                             'level': 8,
                                             'name': 'Foulayronnes',
                                             'zip_code': '47510'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-476713-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-476713-HR'},
                           {'type': 'UIC8', 'value': '87476713'},
                           {'type': 'external_code', 'value': 'OCE87476713'}],
                 'coord': {'lat': '44.229778', 'lon': '0.637054'},
                 'id': 'stop_area:OCE:SA:87476713',
                 'label': 'Agen-Dot (Foulayronnes)',
                 'links': [],
                 'name': 'Agen-Dot',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '44.201561',
                                                       'lon': '0.617632'},
                                             'id': 'admin:fr:47001',
                                             'insee': '47001',
                                             'label': 'Agen (47000)',
                                             'level': 8,
                                             'name': 'Agen',
                                             'zip_code': '47000'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-462424-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-462424-HR'},
                           {'type': 'UIC8', 'value': '87462424'},
                           {'type': 'external_code', 'value': 'OCE87462424'}],
                 'coord': {'lat': '44.199168', 'lon': '0.626372'},
                 'id': 'stop_area:OCE:SA:87462424',
                 'label': 'Agen-Lycée-Palissy (Agen)',
                 'links': [],
                 'name': 'Agen-Lycée-Palissy',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '44.23912',
                                                       'lon': '0.64707'},
                                             'id': 'admin:fr:47100',
                                             'insee': '47100',
                                             'label': 'Foulayronnes (47510)',
                                             'level': 8,
                                             'name': 'Foulayronnes',
                                             'zip_code': '47510'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-465559-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-465559-HR'},
                           {'type': 'UIC8', 'value': '87465559'},
                           {'type': 'external_code', 'value': 'OCE87465559'}],
                 'coord': {'lat': '44.223136', 'lon': '0.633289'},
                 'id': 'stop_area:OCE:SA:87465559',
                 'label': 'Agen-Magnolias (Foulayronnes)',
                 'links': [],
                 'name': 'Agen-Magnolias',
                 'timezone': 'Europe/Paris'},
                {'administrative_regions': [{'coord': {'lat': '44.201561',
                                                       'lon': '0.617632'},
                                             'id': 'admin:fr:47001',
                                             'insee': '47001',
                                             'label': 'Agen (47000)',
                                             'level': 8,
                                             'name': 'Agen',
                                             'zip_code': '47000'}],
                 'codes': [{'type': 'CR-CI-CH', 'value': '0087-465542-HR'},
                           {'type': 'CR-CI-CH', 'value': '0087-465542-HR'},
                           {'type': 'UIC8', 'value': '87465542'},
                           {'type': 'external_code', 'value': 'OCE87465542'}],
                 'coord': {'lat': '44.217888', 'lon': '0.628395'},
                 'id': 'stop_area:OCE:SA:87465542',
                 'label': 'Agen-Payou (Agen)',
                 'links': [],
                 'name': 'Agen-Payou',
                 'timezone': 'Europe/Paris'}]}

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.
In [9]: