web-dev-qa-db-fra.com

Python: Comment puis-je écrire une liste dans un fichier puis la récupérer en mémoire (dict représenté sous la forme d'une chaîne convertie en dict) ultérieurement?

Dupe plus spécifique de 875228 - Stockage simple de données en Python .

J'ai un dict assez volumineux (6 Go) et je dois faire quelques traitements dessus. J'essaie plusieurs méthodes de regroupement de documents, je dois donc tout garder en mémoire en même temps. 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, puis générer à nouveau le dict. Je cherche un moyen d'écrire ce dict dans un fichier, afin de pouvoir le charger en mémoire au lieu de recalculer toutes ses valeurs.

pour simplifier à l'extrême, cela ressemble à quelque chose comme: {((('Word', 'liste'), (1,2), (1,3)), (...)): 0.0, ....}

Je pense que le python doit avoir un meilleur moyen que moi de parcourir une chaîne à la recherche de: and (essayer de l’analyser dans un dictionnaire.

28
RodLaCour

Pourquoi ne pas utiliser python pickle ? Python possède un excellent module de sérialisation appelé pickle, très facile à utiliser.

import cPickle
cPickle.dump(obj, open('save.p', 'wb')) 
obj = cPickle.load(open('save.p', 'rb'))

Pickle présente deux inconvénients:

  • Elle n'est pas sécurisée contre les données erronées ou Construites avec malveillance. Ne jamais supprimer les données reçues d'une source non fiable ou non authentifiée.
  • Le format n'est pas lisible par l'homme.

Si vous utilisez Python 2.6, il existe un module intégré appelé json . C'est aussi simple que pickle à utiliser:

import json
encoded = json.dumps(obj)
obj = json.loads(encoded)

Le format Json est lisible par l’homme et ressemble beaucoup à la représentation de chaîne de dictionnaire en python. Et n'a pas de problèmes de sécurité comme cornichon. Mais pourrait être plus lent que cPickle.

60
Nadia Alramli

J'utiliserais shelve , json, yaml ou autre, comme suggéré par d'autres réponses. 

shelve est spécialement cool parce que vous pouvez avoir dict sur le disque et l'utiliser quand même. Les valeurs seront chargées à la demande.

Mais si vous voulez vraiment analyser le texte de dict et qu'il ne contient que strings, ints et Tuples comme vous l'avez montré, vous pouvez utiliser ast.literal_eval pour les analyser. C'est beaucoup plus sûr, car vous ne pouvez pas évaluer les expressions complètes avec cela. Cela ne fonctionne qu'avec strings, numbers, Tuples, lists, dicts, booleans et None:

>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
12
nosklo

Je suggérerais que vous utilisiez YAML pour votre format de fichier afin que vous puissiez le bricoler 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 d'utiliser easy_install pyyaml. Voir http://pyyaml.org/

Il est livré avec des fonctions simples de sauvegarde/chargement de fichiers, dont je ne me souviens plus tout de suite.

4
Tom Leys

Voici quelques alternatives en fonction de vos besoins:

  • numpy stocke vos données brutes dans un format compact et effectue correctement les opérations de groupe/de masse

  • shelve est comme un grand dict sauvegardé par un fichier

  • un module de stockage tiers, par exemple stash, stocke des données ordinaires arbitraires

  • base de données appropriée, par exemple mongodb pour les données velues ou les données simples mysql ou sqlite et une récupération plus rapide

0
Dima Tisnek

Cette solution chez SourceForge utilise uniquement les modules Python standard:

module y_serial.py :: entrepôt d'objets Python avec SQLite

"Sérialisation + persistance :: dans quelques lignes de code, compressez et annotez les objets Python dans SQLite; puis récupérez-les plus tard chronologiquement par mots-clés sans SQL. Module" standard "le plus utile pour qu'une base de données puisse stocker des données sans schéma."

http://yserial.sourceforge.net

Le bonus à la compression réduira probablement votre dictionnaire de 6 Go à 1 Go. Si vous ne souhaitez pas stocker une série de dictionnaires dans le magasin, le module contient également une solution file.gz qui pourrait être plus appropriée compte tenu de la taille de votre dictionnaire.

0
code43

Ecrivez-le 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 (une représentation pouvant être évaluée pour produire à nouveau la représentation en mémoire).

0
workmad3