Question Comment écrire des données JSON dans un fichier?


J'ai des données JSON stockées dans la variable data.

Je veux écrire cela dans un fichier texte pour le tester, donc je n'ai pas besoin de récupérer les données du serveur à chaque fois.

Actuellement, j'essaie ceci:

obj = open('data.txt', 'wb')
obj.write(data)
obj.close

Et je reçois l'erreur:

TypeError: must be string or buffer, not dict

Comment régler ceci?


680
2017-09-06 22:21


origine


Réponses:


Vous avez oublié la partie JSON réelle - data est un dictionnaire et pas encore codé en JSON. Écrivez comme ceci:

import json
with open('data.json', 'w') as outfile:
    json.dump(data, outfile)

Remarque: Fonctionne à la fois sur 3.x et 2.x.


1318
2017-09-06 22:23



Obtenir utf8-encodé


200
2018-02-14 08:22



Je répondrais avec une légère modification avec les réponses mentionnées ci-dessus et c'est d'écrire un fichier JSON prétendu que les yeux humains peuvent mieux lire. Pour cela, passez sort_keys comme True et indent avec 4 caractères d'espace et vous êtes prêt à partir. Assurez-vous également que les codes ascii ne seront pas écrits dans votre fichier JSON:

with open('data.txt', 'w') as outfile:
     json.dump(jsonData, outfile, sort_keys = True, indent = 4,
               ensure_ascii = False)

130
2017-12-25 20:04



Lire et écrire des fichiers JSON avec Python 2 + 3; fonctionne avec unicode

# -*- coding: utf-8 -*-
import json

# Make it work for Python 2+3 and with Unicode
import io
try:
    to_unicode = unicode
except NameError:
    to_unicode = str

# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
        'a string': 'bla',
        'another dict': {'foo': 'bar',
                         'key': 'value',
                         'the answer': 42}}

# Write JSON file
with io.open('data.json', 'w', encoding='utf8') as outfile:
    str_ = json.dumps(data,
                      indent=4, sort_keys=True,
                      separators=(',', ': '), ensure_ascii=False)
    outfile.write(to_unicode(str_))

# Read JSON file
with open('data.json') as data_file:
    data_loaded = json.load(data_file)

print(data == data_loaded)

Explication des paramètres de json.dump:

  • indent: Utilisez 4 espaces pour mettre en retrait chaque entrée, par ex. quand un nouveau dict est démarré (sinon tout sera dans une ligne),
  • sort_keys: trier les clés des dictionnaires. Ceci est utile si vous voulez comparer des fichiers json avec un outil de comparaison / les mettre sous contrôle de version.
  • separators: Pour empêcher Python d'ajouter des espaces de fin

Avec un paquet

Jetez un oeil à mon paquet utilitaire mpu pour un super simple et facile à retenir:

import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)

Fichier JSON créé

{
    "a list":[
        1,
        42,
        3.141,
        1337,
        "help",
        "€"
    ],
    "a string":"bla",
    "another dict":{
        "foo":"bar",
        "key":"value",
        "the answer":42
    }
}

Terminaisons de fichier communes

.json

Alternatives

Pour votre application, les éléments suivants peuvent être importants:

  • Prise en charge par d'autres langages de programmation
  • Lecture / écriture
  • Compacité (taille du fichier)

Voir également: Comparaison des formats de sérialisation des données

Si vous cherchez plutôt un moyen de créer des fichiers de configuration, vous pouvez lire mon court article Fichiers de configuration en Python


80
2018-06-13 16:43



Pour ceux d'entre vous qui tentent de jeter des langues grecques ou autres "exotiques" comme moi mais qui ont aussi des problèmes (des erreurs unicode) avec des caractères étranges comme le symbole de paix (\ u262E) ou d'autres qui sont souvent contenus dans des données json comme Twitter, la solution pourrait être la suivante (sort_keys est évidemment optionnel):

import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
     f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))

18
2017-07-10 14:45



Je n'ai pas assez de réputation à ajouter dans les commentaires, alors je viens d'écrire quelques-unes de mes découvertes de cette ennuyeuse TypeError ici:

Fondamentalement, je pense que c'est un bug dans le json.dump() Fonctionne en Python 2 seulement - Il ne peut pas vider une donnée Python (dictionnaire / liste) contenant des caractères non-ASCII, même vous ouvrez le fichier avec le encoding = 'utf-8' paramètre. (c'est-à-dire peu importe ce que vous faites). Mais, json.dumps() fonctionne à la fois sur Python 2 et 3.

Pour illustrer ceci, en suivant la réponse de phihag: le code dans sa réponse casse en Python 2 avec exception TypeError: must be unicode, not str, si data contient des caractères non-ASCII. (Python 2.7.6, Debian):

import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'абвгд': 1}
with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

Il fonctionne cependant bien dans Python 3.


10
2018-01-03 06:52



Écrire une donnée dans un fichier en utilisant JSON json.dump () ou json.dumps () utilisé. écrire comme ceci pour stocker des données dans un fichier.

import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
    json.dump(data, txtfile)

cet exemple dans la liste est stocké dans un fichier.


6
2017-12-24 10:58



json.dump(data, open('data.txt', 'wb'))

4
2018-02-29 20:16



si vous essayez d'écrire une image de données pandas dans un fichier en utilisant un format json, je recommande ce

destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()

2
2018-06-03 07:48



Voici une structure utile pour lire et écrire un fichier dans Python 3.

from json import dump, load
from time import sleep
from random import random

def json_file(path, data = None, delay = 0.1):
    while True:
        try:
            if data == None:
                with open(path, "r", encoding = "utf-8") as f:
                    return load(f)
            else:
                with open(path, "w", encoding = "utf-8") as f:
                    return dump(data, f)
        except:
            sleep(random()*delay) # concurrency

0
2018-01-24 10:22