Am JSON datele stocate în variabila "date".
Vreau să scriu asta într-un fișier text pentru testarea deci eu nu't trebuie să luați datele de la server de fiecare dată.
În prezent, încerc asta:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
Si primesc eroarea:
TypeError: trebuie să fie string sau tampon, nu dict
Cum de a repara acest lucru?
Ai uitat efectiv JSON parte - "date" este un dicționar și încă nu JSON-codificate. Scrie astfel pentru compatibilitate maximă (Python 2 și 3):
import json
with open('data.json', 'w') as f:
json.dump(data, f)
Pe un sistem modern (de exemplu Python 3 și UTF-8 suport), puteți scrie un frumos dosar cu
import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
Pentru a obține utf8codificat- fișier ca spre deosebire de asciicodificat- în răspunsul acceptat pentru Python 2 utilizare:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Codul este mai simplu în Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Pe Windows, encoding='utf-8'
argument pentru a "deschis" este încă necesară.
Pentru a evita stocarea de un codat copie a datelor în memorie (rezultat al gropile
) și de ieșire utf8 codificat- bytestrings în ambele Python 2 și 3, utilizați:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
Anii codec-uri.getwriter
apelul este redundant în Python 3, dar care sunt necesare pentru Python 2
Lizibilitate și dimensiuni:
Utilizarea de ensure_ascii=False` oferă o mai bună lizibilitate și de dimensiuni mai mici:
>>> 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
Îmbunătăți lizibilitatea prin adăugarea de steaguri liniuță=4, sort_keys=True
(cum a sugerat de către dinos66) la argumente de "dump" sau gropile
. În acest fel te'll a obține un frumos indentat sortate structura în fișierul json-a costat un pic mai mare dimensiune.
Aș răspunde cu o ușoară modificare cu răspunsurile menționate mai sus și care este de a scrie un prettified fișier JSON care ochii omului poate citi mai bine. Pentru aceasta, se trece `sort_keys "ca fiind" Adevărat " și " liniuță cu 4 caractere spațiu și ești bine să plec. De asemenea, grija de a se asigura că ascii coduri nu vor fi scrise în fișier JSON:
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)
# -*- 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)
Explicarea parametrilor json.groapa de gunoi
:
liniuță
: Foloseste 4 spații pentru liniuță fiecare intrare, de exemplu, atunci când un nou dict este pornit (în caz contrar, totul va fi într-o singură linie),sort_keys
: un fel cheile de dicționare. Acest lucru este util dacă doriți să comparați fișiere json cu un dif instrument / le-a pus sub control de versiune.separatoare
: Pentru a preveni Python din adăugarea la sfârșit spații goaleAvea o privire la meu pachet de utilitate mpu
pentru un super-simplu și ușor de ținut minte una:
import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)
{
"a list":[
1,
42,
3.141,
1337,
"help",
"€"
],
"a string":"bla",
"another dict":{
"foo":"bar",
"key":"value",
"the answer":42
}
}
.json
Pentru aplicația dumneavoastră, următoarele ar putea fi importante:
Vezi de asemenea și: Compararea datelor serialization formate
În cazul în care sunt mai degrabă în căutarea pentru o modalitate de a face fișierele de configurare, poate vrei să-mi citești articol scurt fișiere de Configurare în Python
Pentru cei dintre voi care încearcă să scape de greci sau de alte "exotice" limbi, cum ar fi mine, dar sunt, de asemenea, probleme (erori unicode), cu personaje ciudate, cum ar fi simbol de pace (\u262E) sau altele care sunt adesea cuprinse în json formatat date, cum ar fi Twitter's, soluția ar putea fi după cum urmează (sort_keys este evident opțional):
import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))
Eu nu't au suficient reputația să adăugați în comentarii, așa că am scrie doar niște constatări de acest enervant TypeError aici:
De fapt, cred că-l's un bug în json.dump()funcția în Python **2** doar - L pot't basculante un Piton (dicționar / listă) de date care conțin caractere non-ASCII, *chiar* deschideți fișierul cu
encoding = 'utf-8'parametru. (de exemplu, indiferent de ceea ce faci). Dar,
json.haldele()` funcționează pe ambele Python 2 și 3.
Pentru a ilustra acest lucru, în urma phihag's răspuns: codul în răspunsul său pauze în Python 2, cu excepția TypeError: trebuie să fie unicode, nu str`, dacă "date" conține caractere 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)
Aceasta cu toate acestea funcționează bine în Python 3.
Scrie date în fișier folosind JSON utilizare json.dump() sau json.haldele() folosit. scrie ca aceasta pentru a stoca date în fișier.
import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
json.dump(data, txtfile)
acest exemplu în listă este de a stoca într-un fișier.
Pentru a scrie JSON cu indentare, "destul de print":
import json
outfile = open('data.json')
json.dump(data, outfile, indent=4)
De asemenea, dacă aveți nevoie pentru a depana formatat incorect JSON, și vreau un mesaj de eroare de ajutor, folosesc import simplejsonbibliotecă, în loc de
import json` (funcții ar trebui să fie la fel)
Toate răspunsurile precedente sunt corecte aici este un exemplu foarte simplu:
#! /usr/bin/env python
import json
def write_json():
# create a dictionary
student_data = {"students":[]}
#create a list
data_holder = student_data["students"]
# just a counter
counter = 0
#loop through if you have multiple items..
while counter < 3:
data_holder.append({'id':counter})
data_holder.append({'room':counter})
counter += 1
#write the file
file_path='/tmp/student_data.json'
with open(file_path, 'w') as outfile:
print("writing file to: ",file_path)
# HERE IS WHERE THE MAGIC HAPPENS
json.dump(student_data, outfile)
outfile.close()
print("done")
write_json()
Acceptat răspunsul este în regulă. Cu toate acestea, am fugit în "nu este json serializable" eroare folosind asta.
Aici's cum am reparat-o
cu open("nume de fișier.json", 'g')
ca ieșire:
de ieșire.scrie(str(răspuns))
Deși nu este o soluție bună ca json fișier se creează nu va avea ghilimele, cu toate acestea este mare, dacă sunteți în căutarea pentru rapid și murdar.
JSON datele pot fi scrise într-un fișier, după cum urmează
hist1 = [{'val_loss': [0.5139984398465246],
'val_acc': [0.8002029867684085],
'loss': [0.593220705309384],
'acc': [0.7687131817929321]},
{'val_loss': [0.46456472964199463],
'val_acc': [0.8173602046780344],
'loss': [0.4932038113037539],
'acc': [0.8063946213802453]}]
Scrie într-un fișier:
with open('text1.json', 'w') as f:
json.dump(hist1, f)