Para obter o arquivo codificado em utf8 em vez de codificado em ascii na resposta aceita para o 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))
O código é mais simples no Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
No Windows, o encoding='utf-8'
argumento para open
ainda é necessário.
Para evitar o armazenamento de uma cópia codificada dos dados na memória (resultado de dumps
) e a saída de seqüências de caracteres codificadas em utf8 no Python 2 e 3, use:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
A codecs.getwriter
chamada é redundante no Python 3, mas necessária para o Python 2
Legibilidade e tamanho:
O uso de ensure_ascii=False
fornece melhor legibilidade e tamanho menor:
>>> 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
Melhore ainda mais a legibilidade adicionando sinalizadores indent=4, sort_keys=True
(como sugerido por dinos66 ) aos argumentos de dump
ou dumps
. Dessa forma, você obterá uma estrutura ordenada bem recuada no arquivo json ao custo de um tamanho de arquivo um pouco maior.