Qual é a diferença entre json.dump () e json.dumps () em python?

131

Busquei no presente documento oficial para encontrar diferença entre o json.dump () e json.dumps () em python. É claro que eles estão relacionados à opção de gravação de arquivo.
Mas qual é a diferença detalhada entre eles e em que situações um tem mais vantagem que outro?

Kumaran
fonte

Respostas:

146

Não há muito mais a acrescentar além do que dizem os documentos. Se você deseja despejar o JSON em um arquivo / soquete ou qualquer outra coisa, então você deve prosseguir dump(). Se você precisar apenas dele como uma sequência (para impressão, análise ou o que for), use dumps()(sequência de despejo)

Como mencionado por Antii Haapala nesta resposta , existem algumas pequenas diferenças no ensure_asciicomportamento. Isso se deve principalmente à maneira como a write()função subjacente funciona, sendo que ela opera em partes, e não na cadeia inteira. Veja a resposta dele para mais detalhes.

json.dump()

Serialize obj como um fluxo formatado em JSON para fp (a .write () - suportando objeto semelhante a arquivo

Se sure_ascii for False, alguns chunks gravados em fp podem ser instâncias unicode

json.dumps()

Serialize obj a um str formatado em JSON

Se sure_ascii for False, o resultado poderá conter caracteres não ASCII e o valor de retorno poderá ser uma instância unicode

João Gonçalves
fonte
Você pode mostrar um exemplo de como usar dump () para enviar pelo soquete? Eu sei que posso usar dumps () e encode () para converter em bytes, mas existe alguma maneira mais curta?
Garoto
37

As funções com sparâmetros de seqüência de caracteres take. Os outros recebem fluxos de arquivos.

Pratik Gujarathi
fonte
20

No uso de memória e velocidade.

Quando você o chama jsonstr = json.dumps(mydata), primeiro cria uma cópia completa dos seus dados na memória e somente então você file.write(jsonstr)o envia para o disco. Portanto, esse é um método mais rápido, mas pode ser um problema se você tiver um grande volume de dados para salvar.

Quando você chama json.dump(mydata, file)- sem 's', a nova memória não é usada, pois os dados são despejados por pedaços. Mas todo o processo é cerca de 2 vezes mais lento.

Fonte: Eu verifiquei o código fonte de json.dump()e json.dumps()e também testou ambas as variantes medir o tempo com time.time()e vendo o uso de memória no htop.

JenyaKh
fonte
6

Uma diferença notável no Python 2 é que, se você estiver usando ensure_ascii=False, dumpgravará corretamente os dados codificados em UTF-8 no arquivo (a menos que você tenha usado cadeias de 8 bits com caracteres estendidos que não sejam UTF-8):

dumpspor outro lado, com ensure_ascii=Falsepode produzir um strou unicodeapenas dependendo de quais tipos você usou para seqüências de caracteres:

Serialize obj para um str formatado em JSON usando esta tabela de conversão. Se sure_ascii for False, o resultado poderá conter caracteres não ASCII e o valor de retorno poderá ser uma unicodeinstância .

(ênfase minha). Observe que ainda pode ser uma strinstância também.

Portanto, você não pode usar seu valor de retorno para salvar a estrutura em um arquivo sem verificar com qual formato foi retornado e possivelmente brincando unicode.encode.

É claro que isso não é mais uma preocupação válida no Python 3, já que não há mais essa confusão de 8 bits / Unicode.


Quanto ao loadvs loads, loadconsidera o arquivo inteiro como um documento JSON, portanto, não é possível usá-lo para ler vários documentos JSON limitados por nova linha a partir de um único arquivo.

Antti Haapala
fonte
Todo o texto criado em um objeto de string python é unicode, mas é seguro assumir isso genericamente? ou seja, ao carregar o conteúdo de um arquivo?
João Gonçalves
@ JoãoGonçalves significa que você não pode misturar dados binários com texto, para que o python os aprove silenciosamente. por exemplo json.dumps([b'123'])-> TypeError.
Antti Haapala
O @ JoãoGonçalves também observa que as strings nos documentos JSON devem ser Unicode e devem estar em qualquer um dos UTF-8, UTF-16 ou UTF-32 de acordo com a RFC 7159
Antti Haapala
1
Obrigado por essa explicação! Faz sentido
João Gonçalves