Python: Comment puis-je écrire une liste à un fichier et ensuite la récupérer en mémoire (diction représenté comme une chaîne de caractères convertie en diction) plus tard?
dupe plus spécifique de 875228-stockage de données simples en Python .
j'ai un dict assez grand (6 Go) et j'ai besoin de faire un peu de traitement dessus. Je suis en train d'essayer plusieurs méthodes de regroupement de documents, donc j'ai besoin d'avoir tout ça en mémoire à la fois. J'ai d'autres fonctions à exécuter sur ces données, mais le contenu ne changera pas.
actuellement, chaque fois que je pense à de nouvelles fonctions, je dois les écrire, et puis re-générer le dict. Je cherche un moyen d'écrire ce dict dans un fichier, pour que je puisse le charger en mémoire au lieu de recalculer toutes ses valeurs.
pour simplifier les choses il ressemble à quelque chose comme: liste des mots'),(1,2),(1,3)),(...)): 0.0,....}
je pense que python doit avoir une meilleure façon que moi looping autour d'une corde à la recherche : et ( essayer de le parser dans un dictionnaire.
6 réponses
Pourquoi ne pas utiliser python cornichon ? Python a un grand module de sérialisation appelé pickle il est très facile à utiliser.
import cPickle
cPickle.dump(obj, open('save.p', 'wb'))
obj = cPickle.load(open('save.p', 'rb'))
il y a deux inconvénients avec pickle:
- il n'est pas sûr contre erroné ou des données malicieusement construites. Jamais les données unpickle reçues d'un source non fiable ou non authentifiée.
- Le format n'est pas lisible par l'homme.
si vous utilisez python 2.6, il y a un module intégré appelé json . Il est aussi facile que cornichon à utiliser:
import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
le format Json est lisible par l'humain et est très similaire à la représentation de chaîne de dictionnaires en python. Et n'ont pas de problèmes de sécurité comme les cornichons. Mais peut-être plus lent que cPickle.
j'utiliserais shelve
, json
, yaml
, ou n'importe quoi, comme suggéré par d'autres réponses.
shelve
est spécialement frais parce que vous pouvez avoir le dict
sur le disque et l'utiliser encore. Les valeurs seront chargées à la demande.
mais si vous voulez vraiment analyser le texte du dict
, et il contient seulement str
ings, int
s et tuple
s comme vous l'avez montré, vous pouvez utiliser ast.literal_eval
pour l'analyser. Il est beaucoup plus sûr, puisque vous ne pouvez pas eval expressions complètes avec elle - il ne fonctionne avec str
ings, nombres, tuple
s, list
s, dict
s, bool
eans, et None
:
>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
je vous suggère d'utiliser YAML pour votre format de fichier afin que vous puissiez bricoler avec elle sur le disque
How does it look:
- It is indent based
- It can represent dictionaries and lists
- It is easy for humans to understand
An example: This block of code is an example of YAML (a dict holding a list and a string)
Full syntax: http://www.yaml.org/refcard.html
pour l'obtenir en python, il suffit de easy_install pyyaml. Voir http://pyyaml.org /
il est livré avec des fonctions de sauvegarde / chargement de fichiers faciles, que je ne me souviens pas en ce moment.
L'écrivent dans un format sérialisé, tel que pickle (un module de bibliothèque standard python pour la sérialisation) ou peut-être en utilisant JSON (qui est une représentation qui peut être évaluée pour produire à nouveau la représentation mémoire).
Cette solution à SourceForge utilise uniquement des modules Python standard:
y_serial.py module:: entrepôt des objets Python avec SQLite
"Sérialisation + persistance :: en quelques lignes de code, de compresser et de les annoter des objets Python dans SQLite; puis le récupérer plus tard dans l'ordre chronologique par mots-clés, sans SQL. Module "standard" le plus utile pour une base de données pour stocker des données sans schéma."
http://yserial.sourceforge.net
le bonus de compression réduira probablement votre dictionnaire de 6 Go à 1 Go. Si vous ne voulez pas stocker une série de dictionnaires, le module contient aussi un fichier.GZ solution qui pourrait être plus approprié compte tenu de la taille de votre dictionnaire.
voici quelques alternatives en fonction de vos besoins:
-
numpy
stocke vos données sous une forme compacte et effectue des opérations de groupe/de masse -
shelve
est comme un grand dict soutenu par un fichier -
un module de stockage tiers, p.ex.
stash
, stocke des données simples arbitraires -
base de données appropriée, p.ex. mongodb pour données hairy ou mysql ou SQLite plain data and faster retrieval
"