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?
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
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.
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.
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.
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
As funções com
s
parâmetros de seqüência de caracteres take. Os outros recebem fluxos de arquivos.fonte
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()
ejson.dumps()
e também testou ambas as variantes medir o tempo comtime.time()
e vendo o uso de memória no htop.fonte
Uma diferença notável no Python 2 é que, se você estiver usando
ensure_ascii=False
,dump
gravará 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):dumps
por outro lado, comensure_ascii=False
pode produzir umstr
ouunicode
apenas dependendo de quais tipos você usou para seqüências de caracteres:(ênfase minha). Observe que ainda pode ser uma
str
instâ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
load
vsloads
,load
considera 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.fonte
json.dumps([b'123'])
->TypeError
.