Para obtener utf8 -encoded file en lugar de ascii -encoded en la respuesta aceptada para Python 2 use:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
El código es más simple en Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
En Windows, el encoding='utf-8'
argumento paraopen
sigue siendo necesario.
Para evitar almacenar una copia codificada de los datos en la memoria (resultado de dumps
) y generar cadenas de bytes codificadas por utf8 en Python 2 y 3, use:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
La codecs.getwriter
llamada es redundante en Python 3 pero se requiere para Python 2
Legibilidad y tamaño:
El uso de ensure_ascii=False
da una mejor legibilidad y un tamaño más pequeño:
>>> 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
Mejore aún más la legibilidad agregando banderas indent=4, sort_keys=True
(como lo sugiere dinos66 ) a los argumentos de dump
o dumps
. De esta forma, obtendrá una estructura ordenada muy bien sangrada en el archivo json a costa de un tamaño de archivo ligeramente mayor.