Man mainīgajā data
ir saglabāti JSON dati.
Es gribu to ierakstīt teksta failā testēšanai, lai man katru reizi nebūtu jāpaņem dati no servera.
Pašlaik es mēģinu šādi:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
Un saņemu kļūdu:
TypeError: jābūt virknei vai buferim, nevis dict
Kā to novērst?
Jūs aizmirsāt par faktisko JSON daļu - data
ir vārdnīca, kas vēl nav JSON kodēta. Lai nodrošinātu maksimālu savietojamību (Python 2 un 3), ierakstiet to šādi:
import json
with open('data.json', 'w') as f:
json.dump(data, f)
Mūsdienīgā sistēmā (t.i., Python 3 un UTF-8 atbalsts), jūs varat uzrakstīt skaistāku failu ar
import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
Lai iegūtu utf8-encoded failu pretstatā ascii-encoded pieņemtajā atbildē Python 2 izmantot:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Kods ir vienkāršāks Python 3 versijā:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Operētājsistēmā Windows joprojām ir nepieciešams encoding='utf-8'
arguments open
.
Lai izvairītos no datu kodētas kopijas saglabāšanas atmiņā (dumps
rezultāts) un lai izvadītu utf8-kodētus baitstringus gan Python 2, gan 3, izmantojiet:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
Codecs.getwriter izsaukums ir lieks Python 3, bet nepieciešams Python 2.
Lasāmība un lielums:
Izmantojot ensure_ascii=False
, tiek nodrošināta labāka lasāmība un mazāks izmērs:
>>> 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
Vēl vairāk uzlabojiet lasāmību, pievienojot dump
vai dumps
argumentiem karogus indent=4, sort_keys=True
(kā iesaka dinos66). Šādā veidā jūs iegūsiet json failā sakārtotu struktūru ar skaistām atkāpēm, bet par nedaudz lielāka faila lieluma cenu.
Es atbildētu ar nelielām izmaiņām iepriekš minētajās atbildēs, proti, uzrakstīt pretificētu JSON failu, ko cilvēka acis var labāk izlasīt. Šim nolūkam sort_keys
Trueun
indent` ar 4 atstarpes simboliem, un viss ir kārtībā. Tāpat nodrošiniet, lai jūsu JSON failā netiktu ierakstīti ascii kodi:
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)