Minulla on JSON-tietoja tallennettuna muuttujaan data
.
Haluan kirjoittaa tämän tekstitiedostoon testausta varten, jotta minun ei tarvitse hakea tietoja palvelimelta joka kerta.
Tällä hetkellä yritän tätä:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
Ja saan virheilmoituksen:
TypeError: must be string or buffer, not dict
.
Miten tämä korjataan?
Unohdit varsinaisen JSON-osuuden - data
on sanakirja eikä sitä ole vielä JSON-koodattu. Kirjoita se näin, jotta se olisi mahdollisimman yhteensopiva (Python 2 ja 3):
import json
with open('data.json', 'w') as f:
json.dump(data, f)
Nykyaikaisessa järjestelmässä (eli Python 3:ssa ja UTF-8-tuella) voit kirjoittaa hienomman tiedoston muodossa
import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
Saadaksesi utf8-koodatun tiedoston vastakohtana ascii-koodatulle hyväksytyn vastauksen Python 2:lle käytä:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Koodi on yksinkertaisempi Python 3:ssa:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Windowsissa open
-argumentti encoding='utf-8'
on edelleen tarpeen.
Jos haluat välttää koodatun kopion tallentamisen muistiin (dumppien
tulos) ja tulostaa utf8-koodattuja tavujonoja sekä Python 2:ssa että 3:ssa, käytä:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
Kutsu codecs.getwriter
on tarpeeton Python 3:ssa, mutta tarvitaan Python 2:ssa.
Lukettavuus ja koko:
ensure_ascii=False
:n käyttö parantaa luettavuutta ja pienentää kokoa:
>>> 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
Paranna luettavuutta lisäämällä liput indent=4, sort_keys=True
(kuten dinos66 ehdotti) dump
- tai dumps
-argumentteihin. Näin saat json-tiedostoon hienosti sisennetyn ja lajitellun rakenteen hieman suuremman tiedostokoon kustannuksella.
Vastaisin hieman muutettuna edellä mainittuihin vastauksiin, ja se on kirjoittaa kaunisteltu JSON-tiedosto, jota ihmissilmät voivat lukea paremmin. Tätä varten anna sort_keys
arvoksi True
ja indent
4 välilyöntiä ja olet valmis. Huolehdi myös siitä, että JSON-tiedostoon ei kirjoiteta ascii-koodeja:
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)