Ako zapísať údaje JSON do súboru?

V premennej data mám uložené údaje JSON.

Chcem to zapísať do textového súboru na testovanie, aby som nemusel zakaždým chytať údaje zo servera.

Momentálne skúšam toto:

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

A dostávam chybu:

TypeError: must be string or buffer, not dict

Ako to opraviť?

Riešenie

Zabudli ste na skutočnú časť JSON - data je slovník a ešte nie je zakódovaný do JSON. Napíšte ho takto pre maximálnu kompatibilitu (Python 2 a 3):

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

V modernom systéme (t. j. Python 3 a podpora UTF-8) môžete napísať krajší súbor s

import json
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)
Komentáre (21)

Ak chcete získať súbor utf8-encoded na rozdiel od ascii-encoded v akceptovanej odpovedi pre Python 2, použite:

import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
  f.write(json.dumps(data, ensure_ascii=False))

Kód je v Pythone 3 jednoduchší:

import json
with open('data.txt', 'w') as f:
  json.dump(data, f, ensure_ascii=False)

V systéme Windows je stále potrebný argument encoding='utf-8' pre open.

Ak sa chcete vyhnúť ukladaniu kódovanej kópie údajov do pamäte (výsledok dumps) a na výstup utf8-kódovaných bajtových reťazcov v Pythone 2 aj 3, použite:

import json, codecs
with open('data.txt', 'wb') as f:
    json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)

Volanie codecs.getwriter je v Pythone 3 zbytočné, ale v Pythone 2 je potrebné


Čítateľnosť a veľkosť:

Použitie ensure_ascii=False poskytuje lepšiu čitateľnosť a menšiu veľkosť:

>>> json.dumps({'price': '€10'})
'{"price": "\\u20ac10"}'
>>> json.dumps({'price': '€10'}, ensure_ascii=False)
'{"price": "€10"}'

>>> len(json.dumps({'абвгд': 1}))
37
>>> len(json.dumps({'абвгд': 1}, ensure_ascii=False).encode('utf8'))
17

Čitateľnosť ďalej zlepšíte pridaním príznakov indent=4, sort_keys=True (ako navrhuje dinos66) k argumentom príkazu dump alebo dumps. Takto'získate pekne odsadenú zoradenú štruktúru v súbore json za cenu mierne väčšej veľkosti súboru.

Komentáre (18)

Odpovedal by som s malou modifikáciou s vyššie uvedenými odpoveďami, a to je napísať skrátený súbor JSON, ktorý ľudské oči môžu lepšie čítať. Na tento účel odovzdajte sort_keys ako True a indent so 4 znakmi medzery a môžete začať. Dbajte tiež na to, aby sa do vášho súboru JSON nezapisovali kódy ascii:

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