Python: Le module json

Sous Python, le module json permet de créer et de lire des données au format json.

Repartons de cet exemple: Python: Parser et indenter un flux XML

J'ai donc un dictionnaire de données contenant les valeurs suivantes:

>>> from pprint import pprint
>>> pprint(datas)
{'2782113': {'countryCode': 'AT',
             'countryName': 'Austria',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '47.33333',
             'lng': '13.33333',
             'name': 'Austria',
             'toponymName': 'Republic of Austria'},
 '2921044': {'countryCode': 'DE',
             'countryName': 'Germany',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '51.5',
             'lng': '10.5',
             'name': 'Germany',
             'toponymName': 'Federal Republic of Germany'},
 '3017382': {'countryCode': 'FR',
             'countryName': 'France',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '46',
             'lng': '2',
             'name': 'France',
             'toponymName': 'Republic of France'},
 '3042058': {'countryCode': 'LI',
             'countryName': 'Liechtenstein',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '47.16667',
             'lng': '9.53333',
             'name': 'Liechtenstein',
             'toponymName': 'Principality of Liechtenstein'},
 '3175395': {'countryCode': 'IT',
             'countryName': 'Italy',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '42.83333',
             'lng': '12.83333',
             'name': 'Italy',
             'toponymName': 'Repubblica Italiana'}}
>>>

Pour convertir ce dictionnaire au format json, il suffit d'utiliser le module json de Python:

>>> import json
>>> print(json.dumps(datas, indent=4))
{
    "3017382": {
        "toponymName": "Republic of France",
        "lat": "46",
        "countryName": "France",
        "fcl": "A",
        "fcode": "PCLI",
        "name": "France",
        "countryCode": "FR",
        "lng": "2"
    },
    "3175395": {
        "toponymName": "Repubblica Italiana",
        "lat": "42.83333",
        "countryName": "Italy",
        "fcl": "A",
        "fcode": "PCLI",
        "name": "Italy",
        "countryCode": "IT",
        "lng": "12.83333"
    },
    "2921044": {
        "toponymName": "Federal Republic of Germany",
        "lat": "51.5",
        "countryName": "Germany",
        "fcl": "A",
        "fcode": "PCLI",
        "name": "Germany",
        "countryCode": "DE",
        "lng": "10.5"
    },
    "3042058": {
        "toponymName": "Principality of Liechtenstein",
        "lat": "47.16667",
        "countryName": "Liechtenstein",
        "fcl": "A",
        "fcode": "PCLI",
        "name": "Liechtenstein",
        "countryCode": "LI",
        "lng": "9.53333"
    },
    "2782113": {
        "toponymName": "Republic of Austria",
        "lat": "47.33333",
        "countryName": "Austria",
        "fcl": "A",
        "fcode": "PCLI",
        "name": "Austria",
        "countryCode": "AT",
        "lng": "13.33333"
    }
}
>>>

Dans la commande précédente, j'ai utiliser la fonction dumps du module json qui permet de formater n'importe quel objet Python (dictionnaire, liste, une chaine de caractères, un nombre) au format json avec en plus une indentation avec 4 espaces (indent=4).

Il est donc tout à fait possible d'enregistrer ce résultat dans un fichier:

>>> with open('datas.json', 'w') as f:
    f.write(json.dumps(datas, indent=4))

    
1293
>>>

Ou alors avec la fonction dump (sans le `s` à la fin).
Cette commande permet d'enregistrer les données directement dans le flux précédemment ouvert.

>>> with open('datas.json', 'w') as f:
    json.dump(datas, f, indent=4)

    
>>>

Et voilà, je me retrouve avec un beau fichier json tout beau tout neuf.

Et pour lire un contenu json:

>>> with open('datas.json', 'r') as f:
    datas = json.load(f)

    
>>> type(datas)
<class 'dict'>
>>> pprint(datas)
{'2782113': {'countryCode': 'AT',
             'countryName': 'Austria',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '47.33333',
             'lng': '13.33333',
             'name': 'Austria',
             'toponymName': 'Republic of Austria'},
 '2921044': {'countryCode': 'DE',
             'countryName': 'Germany',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '51.5',
             'lng': '10.5',
             'name': 'Germany',
             'toponymName': 'Federal Republic of Germany'},
 '3017382': {'countryCode': 'FR',
             'countryName': 'France',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '46',
             'lng': '2',
             'name': 'France',
             'toponymName': 'Republic of France'},
 '3042058': {'countryCode': 'LI',
             'countryName': 'Liechtenstein',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '47.16667',
             'lng': '9.53333',
             'name': 'Liechtenstein',
             'toponymName': 'Principality of Liechtenstein'},
 '3175395': {'countryCode': 'IT',
             'countryName': 'Italy',
             'fcl': 'A',
             'fcode': 'PCLI',
             'lat': '42.83333',
             'lng': '12.83333',
             'name': 'Italy',
             'toponymName': 'Repubblica Italiana'}}
>>>

Grâce à la fonction load du module json, je peux charger tout le contenu d'un fichier json directement dans une variable.

Cette variable est de type dict (dictionnaire)

La fonction loads (avec un `s` à la fin) permet de charger une chaine de caractères au format json.

Etiquettes: 

Commentaires

Bonjour,
Merci beaucoup pour le code ! J'essaie de lire un fichier bookmark du web chromium, avec une structure de sous dossiers, comment je dois faire ? Je suis débutante dans l'utilisation de json sous Python..

N'ayant pas ce genre de fichier sous la main, je ne sais pas du tout comment il est structuré.
Si tu pouvais me fournir un exemple.

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.