Estou acostumado a trazer dados para dentro e para fora do Python usando arquivos .csv, mas há desafios óbvios nisso. Algum conselho sobre maneiras simples de armazenar um dicionário (ou conjuntos de dicionários) em um arquivo json ou pck? Por exemplo:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Gostaria de saber como salvar isso e como carregá-lo novamente.
Respostas:
Economia de picles :
Consulte a documentação do módulo pickle para obter informações adicionais sobre o
protocol
argumento.Carga em conserva :
Salvar JSON :
Forneça argumentos extras como
sort_keys
ouindent
para obter um resultado bonito. O argumento sort_keys classificará as chaves em ordem alfabética e o indent recuará sua estrutura de dados comindent=N
espaços.Carregamento JSON :
fonte
pickle.dump
. Se o arquivo não precisar ser legível por humanos, poderá acelerar bastante as coisas.json.dump(data, fp, sort_keys=True, indent=4)
. Mais informações podem ser encontradas aquipickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
import pickle
Exemplo mínimo, gravando diretamente em um arquivo:
ou abrir / fechar com segurança:
Se você deseja salvá-lo em uma string em vez de em um arquivo:
fonte
Veja também o pacote acelerado ujson. https://pypi.python.org/pypi/ujson
fonte
Para gravar em um arquivo:
Para ler de um arquivo:
myfile
é o objeto de arquivo no qual você armazenou o dict.fonte
json.dump(myfile)
ejson.load(myfile)
Se você estiver após a serialização, mas não precisará dos dados em outros programas, recomendo fortemente o
shelve
módulo. Pense nisso como um dicionário persistente.fonte
json
é mais conveniente.shelve
é melhor apenas para acessar uma chave de cada vez.Se você quiser uma alternativa para
pickle
oujson
, poderá usarklepto
.Com
klepto
, se você tivesse usadoserialized=True
, o dicionário teria sido gravadomemo.pkl
como um dicionário em conserva em vez de com texto não criptografado.Você pode obter
klepto
aqui: https://github.com/uqfoundation/kleptodill
é provavelmente uma escolha melhor para a decapagem do que parapickle
si mesma, poisdill
pode serializar quase tudo em python.klepto
também pode usardill
.Você pode obter
dill
aqui: https://github.com/uqfoundation/dillO mumbo-jumbo adicional nas primeiras linhas é porque
klepto
pode ser configurado para armazenar dicionários em um arquivo, em um contexto de diretório ou em um banco de dados SQL. A API é a mesma para o que você escolher como arquivo morto. Ele fornece um dicionário "arquivável" com o qual você pode usarload
edump
interagir com o arquivo.fonte
Este é um tópico antigo, mas, para ser completo, devemos incluir o ConfigParser e o configparser, que fazem parte da biblioteca padrão em Python 2 e 3, respectivamente. Este módulo lê e grava em um arquivo config / ini e (pelo menos no Python 3) se comporta de várias maneiras, como um dicionário. Ele tem o benefício adicional de poder armazenar vários dicionários em seções separadas do seu arquivo config / ini e recuperá-los. Doce!
Exemplo do Python 2.7.x.
Exemplo de Python 3.X.
saída do console
conteúdo do config.ini
fonte
Se salvar em um arquivo json, a melhor e mais fácil maneira de fazer isso é:
fonte
json.dump( )
que o descrito na outra resposta?meu caso de uso foi salvar vários objetos json em um arquivo e a resposta de marty me ajudou um pouco. Mas, para servir ao meu caso de uso, a resposta não estava completa, pois substituiria os dados antigos toda vez que uma nova entrada é salva.
Para salvar várias entradas em um arquivo, é necessário verificar o conteúdo antigo (isto é, ler antes de escrever). Um arquivo típico que contém dados json terá a
list
ou aobject
como root. Por isso, considerei que meu arquivo json sempre tem umalist of objects
e toda vez que adiciono dados a ele, basta carregar a lista primeiro, anexar meus novos dados e despejá-lo novamente em uma instância gravável de file (w
):o novo arquivo json será mais ou menos assim:
NOTA: É essencial ter um arquivo nomeado
file.json
com[]
dados iniciais para que essa abordagem funcionePS: não relacionado à pergunta original, mas essa abordagem também pode ser aprimorada ainda mais, verificando se a entrada já existe (com base em 1 / várias chaves) e somente depois anexando e salvando os dados. Deixe-me saber se alguém precisar dessa verificação, acrescentarei à resposta
fonte