txt texto sobreescribir lista leer fichero escribir datos dat como columnas archivos archivo abrir python pickle

texto - Python: ¿Cómo escribo una lista en un archivo y luego la devuelvo a la memoria(dict representado como una cadena convertida a dict) más tarde?



leer columnas de un archivo en python (6)

Dupe más específico de 875228: almacenamiento de datos simple en Python .

Tengo un dict bastante grande (6 GB) y necesito procesarlo. Estoy probando varios métodos de agrupación de documentos, así que necesito tener todo en memoria al mismo tiempo. Tengo otras funciones para ejecutar en estos datos, pero los contenidos no cambiarán.

Actualmente, cada vez que pienso en nuevas funciones tengo que escribirlas y luego volver a generar el dict. Estoy buscando una manera de escribir este dictado en un archivo, de modo que pueda cargarlo en la memoria en lugar de recalcular todos sus valores.

para simplificar demasiado las cosas, se parece a: {((('''' word '','' list ''), (1,2), (1,3)), (...)): 0.0, ....}

Siento que Python debe tener una mejor manera que yo en busca de una cadena: e (intentando analizarlo en un diccionario).


¿Por qué no usar pepinillo pitón ? Python tiene un gran módulo de serialización llamado pickle que es muy fácil de usar.

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

Hay dos desventajas con pickle:

  • No es seguro contra datos erróneos o malintencionados. Nunca descomprima los datos recibidos de una fuente no confiable o no autenticada.
  • El formato no es legible por humanos.

Si está usando Python 2.6, hay un módulo incorporado llamado json . Es tan fácil de usar como un pepinillo:

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

El formato Json es legible para los humanos y es muy similar a la representación de la cadena del diccionario en python. Y no tiene ningún problema de seguridad como el pepinillo. Pero podría ser más lento que cPickle.


Aquí hay algunas alternativas dependiendo de sus requerimientos:

  • numpy almacena sus datos simples en una forma compacta y realiza bien las operaciones de grupo / masa

  • shelve es como un dict grande respaldado por un archivo

  • Algunos módulos de almacenamiento de terceros, por ejemplo, stash , almacenan datos simples arbitrarios

  • base de datos adecuada, por ejemplo, mongodb para datos peludos o mysql o sqlite datos simples y recuperación más rápida


Escríbalo en un formato serializado, como pickle (un módulo de biblioteca estándar de Python para la serialización) o quizás utilizando JSON (que es una representación que se puede evaluar para producir la representación de la memoria nuevamente).


Esta solución en SourceForge utiliza solo módulos estándar de Python:

y_serial.py module :: warehouse objetos de Python con SQLite

"Serialización + persistencia :: en unas pocas líneas de código, comprima y anote los objetos de Python en SQLite; luego, recupérelos cronológicamente mediante palabras clave sin ningún tipo de SQL. El módulo" estándar "más útil para que una base de datos almacene datos sin esquema".

http://yserial.sourceforge.net

El bono de compresión probablemente reducirá su diccionario de 6GB a 1GB. Si no desea almacenar una serie de diccionarios, el módulo también contiene una solución file.gz que podría ser más adecuada dado el tamaño de su diccionario.


Le sugiero que use YAML para su formato de archivo, de modo que pueda modificarlo en el disco.

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

Para obtenerlo en python, simplemente easy_install pyyaml. Ver http://pyyaml.org/

Viene con funciones fáciles de guardar / cargar archivos, que no recuerdo en este momento.


yaml , json , yaml , o lo que sea, como lo sugieren otras respuestas.

shelve es especialmente bueno porque puede tener el dict en el disco y seguir utilizándolo. Los valores serán cargados a pedido.

Pero si realmente desea analizar el texto del dict , y contiene solo cadenas, int sy tuple como las que ha mostrado, puede usar ast.literal_eval para analizarlas. Es mucho más seguro, ya que no se pueden evaluar expresiones completas con él. Solo funciona con cadenas, números, tuple , list , dict s, booleans y None :

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