¿Cuál es la diferencia entre json.dump () y json.dumps () en python?
131
Busqué en este documento oficial para encontrar la diferencia entre json.dump () y json.dumps () en python. Está claro que están relacionados con la opción de escritura de archivos. Pero, ¿cuál es la diferencia detallada entre ellos y en qué situaciones uno tiene más ventaja que otro?
No hay mucho más que agregar aparte de lo que dicen los documentos. Si desea volcar el JSON en un archivo / socket o lo que sea, entonces debe ir con dump(). Si solo lo necesita como una cadena (para imprimir, analizar o lo que sea), use dumps()(volcar cadena)
Como mencionó Antii Haapala en esta respuesta , hay algunas diferencias menores en el ensure_asciicomportamiento. Esto se debe principalmente a cómo write()funciona la función subyacente , ya que opera en fragmentos en lugar de en toda la cadena. Verifique su respuesta para obtener más detalles al respecto.
json.dump()
Serialice obj como una secuencia con formato JSON a fp (a .write () - compatible con un objeto similar a un archivo
Si sure_ascii es False, algunos fragmentos escritos en fp pueden ser instancias unicode
json.dumps()
Serializar obj a un str con formato JSON
Si sure_ascii es False, el resultado puede contener caracteres no ASCII y el valor de retorno puede ser una instancia unicode
¿Puedes mostrar un ejemplo sobre cómo usar dump () para enviar a través del socket? Sé que puedo usar dumps () y luego encode () para convertir a bytes, pero ¿hay alguna forma más corta?
Niño
37
Las funciones con una stoma de parámetros de cadena. Los otros toman secuencias de archivos.
Cuando lo llama jsonstr = json.dumps(mydata)primero crea una copia completa de sus datos en la memoria y solo entonces ustedfile.write(jsonstr) envía al disco. Por lo tanto, este es un método más rápido, pero puede ser un problema si tiene una gran cantidad de datos para guardar.
Cuando llama json.dump(mydata, file), sin 's', no se utiliza memoria nueva, ya que los datos son volcados por fragmentos. Pero todo el proceso es aproximadamente 2 veces más lento.
Fuente: Verifiqué el código fuente de json.dump()y json.dumps()también probé las dos variantes que miden el tiempo time.time()y observan el uso de la memoria en htop.
Una diferencia notable en Python 2 es que si estás usando ensure_ascii=False,dump escribirá correctamente los datos codificados UTF-8 en el archivo (a menos que haya utilizado cadenas de 8 bits con caracteres extendidos que no sean UTF-8):
dumpspor otro lado, con ensure_ascii=Falsepuede producir un stro unicodesolo dependiendo de los tipos que usó para las cadenas:
Serialice el obj a una cadena con formato JSON utilizando esta tabla de conversión. Si sure_ascii es False, el resultado puede contener caracteres no ASCII y el valor de retorno puede ser una unicodeinstancia .
(énfasis mío). Tenga en cuenta que aún puede ser una strinstancia también.
Por lo tanto, no puede usar su valor de retorno para guardar la estructura en un archivo sin verificar qué formato se devolvió y posiblemente jugar con él unicode.encode.
Esto, por supuesto, ya no es una preocupación válida en Python 3, ya que no hay más esta confusión de 8 bits / Unicode.
En cuanto a loadvs loads, loadconsidera que todo el archivo es un documento JSON, por lo que no puede usarlo para leer varios documentos JSON limitados de nueva línea de un solo archivo.
Todo el texto creado en un objeto de cadena de Python es unicode, pero ¿es seguro asumirlo genéricamente? es decir, al cargar contenido de un archivo?
João Gonçalves
@ JoãoGonçalves significa que no puede mezclar datos binarios con texto para que Python lo apruebe en silencio. p.ejjson.dumps([b'123']) -> TypeError.
Antti Haapala
@ JoãoGonçalves también nota que las cadenas en los documentos JSON deben ser Unicode , y deben estar en cualquiera de UTF-8, UTF-16 o UTF-32 de acuerdo con RFC 7159
Las funciones con una
s
toma de parámetros de cadena. Los otros toman secuencias de archivos.fuente
En uso de memoria y velocidad.
Cuando lo llama
jsonstr = json.dumps(mydata)
primero crea una copia completa de sus datos en la memoria y solo entonces ustedfile.write(jsonstr)
envía al disco. Por lo tanto, este es un método más rápido, pero puede ser un problema si tiene una gran cantidad de datos para guardar.Cuando llama
json.dump(mydata, file)
, sin 's', no se utiliza memoria nueva, ya que los datos son volcados por fragmentos. Pero todo el proceso es aproximadamente 2 veces más lento.Fuente: Verifiqué el código fuente de
json.dump()
yjson.dumps()
también probé las dos variantes que miden el tiempotime.time()
y observan el uso de la memoria en htop.fuente
Una diferencia notable en Python 2 es que si estás usando
ensure_ascii=False
,dump
escribirá correctamente los datos codificados UTF-8 en el archivo (a menos que haya utilizado cadenas de 8 bits con caracteres extendidos que no sean UTF-8):dumps
por otro lado, conensure_ascii=False
puede producir unstr
ounicode
solo dependiendo de los tipos que usó para las cadenas:(énfasis mío). Tenga en cuenta que aún puede ser una
str
instancia también.Por lo tanto, no puede usar su valor de retorno para guardar la estructura en un archivo sin verificar qué formato se devolvió y posiblemente jugar con él
unicode.encode
.Esto, por supuesto, ya no es una preocupación válida en Python 3, ya que no hay más esta confusión de 8 bits / Unicode.
En cuanto a
load
vsloads
,load
considera que todo el archivo es un documento JSON, por lo que no puede usarlo para leer varios documentos JSON limitados de nueva línea de un solo archivo.fuente
json.dumps([b'123'])
->TypeError
.