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.

28
demandé sur Community 2009-05-21 02:02:21

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.

60
répondu Nadia Alramli 2009-05-20 23:15:37

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)}
12
répondu nosklo 2009-05-21 17:17:01

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.

4
répondu Tom Leys 2009-05-20 22:57:08

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).

0
répondu workmad3 2009-05-20 22:27:09

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.

0
répondu 2009-10-02 23:20:55

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

  • "
0
répondu Dima Tisnek 2012-11-05 15:15:06