Estoy acostumbrado a ingresar y sacar datos de Python usando archivos .csv, pero hay desafíos obvios para esto. ¿Algún consejo sobre formas simples de almacenar un diccionario (o conjuntos de diccionarios) en un archivo json o pck? Por ejemplo:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Me gustaría saber cómo guardar esto y luego cómo volver a cargarlo.
Respuestas:
Pickle save:
Consulte la documentación del módulo pickle para obtener información adicional sobre el
protocol
argumento.Carga de pepinillos :
JSON guardar:
Proporcione argumentos adicionales como
sort_keys
oindent
para obtener un resultado bonito. El argumento sort_keys ordenará las claves alfabéticamente y la sangría sangrará su estructura de datos conindent=N
espacios.Carga JSON :
fuente
pickle.dump
. Si el archivo no necesita ser legible por humanos, puede acelerar mucho las cosas.json.dump(data, fp, sort_keys=True, indent=4)
. Más información se puede encontrar aquípickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
import pickle
Ejemplo mínimo, escribir directamente en un archivo:
o abrir / cerrar de forma segura:
Si desea guardarlo en una cadena en lugar de un archivo:
fuente
También vea el paquete acelerado ujson. https://pypi.python.org/pypi/ujson
fuente
Para escribir en un archivo:
Para leer de un archivo:
myfile
es el objeto de archivo para el archivo en el que almacenó el dict.fuente
json.dump(myfile)
yjson.load(myfile)
Si busca la serialización pero no necesita los datos en otros programas, le recomiendo el
shelve
módulo. Piense en ello como un diccionario persistente.fuente
json
es más conveniente.shelve
solo es mejor para acceder a una clave a la vez.Si desea una alternativa a
pickle
ojson
, puede usarklepto
.Con
klepto
, si hubiera utilizadoserialized=True
, el diccionario se habría escritomemo.pkl
como un diccionario en vinagre en lugar de con texto claro.Puedes llegar
klepto
aquí: https://github.com/uqfoundation/kleptodill
Probablemente sea una mejor opción para conservar en vinagre que enpickle
sí mismo, ya quedill
puede serializar casi cualquier cosa en Python.klepto
También puede usardill
.Puedes llegar
dill
aquí: https://github.com/uqfoundation/dillEl mumbo-jumbo adicional en las primeras líneas se debe a que
klepto
se puede configurar para almacenar diccionarios en un archivo, en un contexto de directorio o en una base de datos SQL. La API es la misma para lo que elija como archivo de back-end. Le proporciona un diccionario "archivable" con el que puede usarload
edump
interactuar con el archivo.fuente
Este es un tema antiguo, pero para completar, debemos incluir ConfigParser y configparser que forman parte de la biblioteca estándar en Python 2 y 3, respectivamente. Este módulo lee y escribe en un archivo config / ini y (al menos en Python 3) se comporta de muchas maneras como un diccionario. Tiene el beneficio adicional de que puede almacenar múltiples diccionarios en secciones separadas de su archivo config / ini y recuperarlos. ¡Dulce!
Python 2.7.x ejemplo.
Python 3.X ejemplo.
salida de consola
contenido de config.ini
fuente
Si guarda en un archivo json, la mejor y más fácil forma de hacerlo es:
fuente
json.dump( )
como se describe en la otra respuesta?mi caso de uso fue guardar múltiples objetos json en un archivo y la respuesta de marty me ayudó un poco. Pero para responder a mi caso de uso, la respuesta no estaba completa, ya que sobrescribiría los datos antiguos cada vez que se guarda una nueva entrada.
Para guardar múltiples entradas en un archivo, uno debe verificar el contenido anterior (es decir, leer antes de escribir). Un archivo típico que contiene datos json tendrá una
list
o unaobject
raíz. Así que consideré que mi archivo json siempre tiene unalist of objects
y cada vez que agrego datos a ella, simplemente cargo la lista primero, agrego mis nuevos datos y la vuelvo a una instancia de archivo de solo escritura (w
):el nuevo archivo json se verá así:
NOTA: Es esencial tener un archivo con el nombre
file.json
con el[]
que los datos iniciales de este enfoque para el trabajoPD: no está relacionado con la pregunta original, pero este enfoque también podría mejorarse más si primero verificamos si nuestra entrada ya existe (basada en 1 / claves múltiples) y solo luego agregamos y guardamos los datos. Avíseme si alguien necesita ese cheque, agregaré a la respuesta
fuente