J'ai l'habitude de faire entrer et sortir des données de Python en utilisant des fichiers .csv, mais il y a des défis évidents à cela. Des conseils sur les moyens simples de stocker un dictionnaire (ou des ensembles de dictionnaires) dans un fichier json ou pck? Par exemple:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Je voudrais savoir comment l'enregistrer, puis comment le charger à nouveau.
Réponses:
Pickle save:
Voir la documentation du module pickle pour plus d'informations sur l'
protocol
argument.Charge de cornichon :
Sauvegarde JSON :
Fournissez des arguments supplémentaires comme
sort_keys
ouindent
pour obtenir un joli résultat. L'argument sort_keys triera les clés par ordre alphabétique et le retrait mettra en retrait votre structure de données avec desindent=N
espaces.Charge JSON :
la source
pickle.dump
. Si le fichier n'a pas besoin d'être lisible par l'homme, cela peut accélérer considérablement les choses.json.dump(data, fp, sort_keys=True, indent=4)
. Plus d'informations peuvent être trouvées icipickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
import pickle
Exemple minimal, écrivant directement dans un fichier:
ou ouverture / fermeture en toute sécurité:
Si vous souhaitez l'enregistrer dans une chaîne au lieu d'un fichier:
la source
Voir également le paquet accéléré ujson. https://pypi.python.org/pypi/ujson
la source
Pour écrire dans un fichier:
Pour lire à partir d'un fichier:
myfile
est l'objet fichier du fichier dans lequel vous avez stocké le dict.la source
json.dump(myfile)
etjson.load(myfile)
Si vous êtes après la sérialisation mais n'avez pas besoin des données dans d'autres programmes, je recommande fortement le
shelve
module. Considérez-le comme un dictionnaire persistant.la source
json
c'est plus pratique.shelve
n'est meilleur que pour accéder à une clé à la fois.Si vous souhaitez une alternative à
pickle
oujson
, vous pouvez utiliserklepto
.Avec
klepto
, si vous l'aviez utiliséserialized=True
, le dictionnaire aurait été écritmemo.pkl
comme un dictionnaire mariné au lieu d'un texte clair.Vous pouvez obtenir
klepto
ici: https://github.com/uqfoundation/kleptodill
est probablement un meilleur choix pour le décapage que lui-pickle
même, car ildill
peut sérialiser presque tout en python.klepto
peut également utiliserdill
.Vous pouvez obtenir
dill
ici: https://github.com/uqfoundation/dillLe mumbo-jumbo supplémentaire sur les premières lignes est dû au fait qu'il
klepto
peut être configuré pour stocker des dictionnaires dans un fichier, dans un contexte de répertoire ou dans une base de données SQL. L'API est la même pour tout ce que vous choisissez comme archive principale. Il vous donne un dictionnaire "archivable" avec lequel vous pouvez utiliserload
etdump
interagir avec l'archive.la source
Il s'agit d'un ancien sujet, mais pour être complet, nous devons inclure ConfigParser et configparser qui font partie de la bibliothèque standard en Python 2 et 3, respectivement. Ce module lit et écrit dans un fichier config / ini et (au moins en Python 3) se comporte de nombreuses manières comme un dictionnaire. Il a l'avantage supplémentaire que vous pouvez stocker plusieurs dictionnaires dans des sections distinctes de votre fichier config / ini et les rappeler. Doux!
Exemple Python 2.7.x.
Exemple Python 3.X.
sortie console
contenu de config.ini
la source
Si vous enregistrez dans un fichier json, la manière la meilleure et la plus simple de procéder est:
la source
json.dump( )
celui décrit dans l'autre réponse?mon cas d'utilisation consistait à enregistrer plusieurs objets json dans un fichier et la réponse de marty m'a un peu aidé. Mais pour répondre à mon cas d'utilisation, la réponse n'était pas complète car elle remplacerait les anciennes données chaque fois qu'une nouvelle entrée est enregistrée.
Pour enregistrer plusieurs entrées dans un fichier, il faut vérifier l'ancien contenu (c'est-à-dire lire avant d'écrire). Un fichier typique contenant des données json aura un
list
ou unobject
comme racine. J'ai donc considéré que mon fichier json a toujours unlist of objects
et chaque fois que j'ajoute des données, je charge simplement la liste en premier, y ajoute mes nouvelles données et les renvoie dans une instance de file (w
) accessible en écriture uniquement :le nouveau fichier json ressemblera à ceci:
REMARQUE: il est essentiel d'avoir un fichier nommé
file.json
avec[]
comme données initiales pour que cette approche fonctionnePS: pas lié à la question d'origine, mais cette approche pourrait également être encore améliorée en vérifiant d'abord si notre entrée existe déjà (sur la base de 1 / plusieurs clés) et ensuite seulement ajouter et enregistrer les données. Faites-moi savoir si quelqu'un a besoin de cette vérification, je vais ajouter à la réponse
la source