Pregunta

Esto es lo que he hecho para un proyecto. Tengo un par de estructuras de datos que son Bascially diccionarios con algunos métodos que operan sobre los datos. Cuando les guardar en disco, las escribo a .py archivos como código que cuando se importan como un módulo cargará los mismos datos en una estructura de datos.

¿Es esto razonable? ¿Hay grandes desventajas? La ventaja que veo es que cuando quiero operar con los datos guardados, puedo importar rápidamente los módulos que necesito. Además, los módulos se pueden utilizar por separado del resto de la aplicación, ya que no es necesario un analizador funcionalidad o cargador separado.

¿Fue útil?

Solución

Es razonable, y lo hago todo el tiempo. Obviamente no es un formato que se utiliza para el intercambio de datos, así que no es un buen formato para nada como un archivo de salvar.

Pero por ejemplo, cuando hago migraciones de sitios web para Plone, a menudo tengo datos sobre el sitio (por ejemplo, una lista de las páginas que se deben migrar, o una lista de cómo es viejo URLs deben asignar a los nuevos, AOR listas de etiquetas). Estos se suelen obtener en formato Word och Excel. También los datos a menudo necesita masajear un poco, y termino con lo que para todos los intentos y propósitos son una asignación uno diccionarios URL para alguna otra información.

Por supuesto, I podría save que, como CVS y analizarlo en un diccionario. Pero en lugar de eso normalmente lo guarda como un archivo de Python con un diccionario. Guarda código.

Así que, sí, es razonable, no, no es un formato que debe usarse para cualquier tipo de guardar el archivo. Es sin embargo a menudo se utiliza para los datos que se extiende a la frontera con la configuración, como anteriormente.

Otros consejos

Al operar de esta manera, es posible obtener alguna pizca de comodidad, pero es pagar muchos tipos de precio por eso. El espacio que se necesita para guardar los datos, y el tiempo que se tarda en tanto guardar y volver a cargarlo, subir sustancialmente; y su exposición de seguridad es ilimitada - se debe proteger con ferocidad los caminos desde el que se vuelva a cargar los módulos, ya que proporcionaría una vía fácil para cualquier atacante inyectar código de su elección a ser ejecutado bajo su nombre de usuario (pickle sí no es sólido como una roca , seguridad-sabia, pero, en comparación con esta disposición, brilla; -).

Con todo, prefiero una disposición más sencilla y más tradicional: código ejecutable vive en un módulo (en una trayectoria típica de código de carga, que no necesita ser R / W, una vez compilado del módulo) - se pone cargada una sola vez y de una forma ya compilado. Datos viven en sus propios archivos (o porciones de base de datos, etc.) en cualquiera de los muchos formatos adecuados, la mayoría de los estándar (posiblemente incluyendo las múltiples idiomas tales como JSON, CSV, XML, ... etc., si quiero seguir la opción abierta para cargar fácilmente los datos de otros idiomas en el futuro).

El mayor inconveniente es que es un problema potencial de seguridad, ya que es difícil garantizar que los archivos no contiene código arbitrario, que puede ser muy malo. Así que no se utilice este método si alguien más de lo que tiene acceso de escritura a los archivos.

A opción razonable podría ser utilizar la salmuera módulo, que está diseñado específicamente para guardar y restaurar las estructuras de pitón en el disco.

La respuesta de Alex Martelli es absolutamente profundo y estoy de acuerdo con él. Sin embargo, voy a ir un paso más allá y hacer una recomendación específica:. Usar JSON

JSON es simple, y las estructuras de datos de Python mapa bien en ella; y hay varias librerías estándar y herramientas para trabajar con JSON. El módulo json en Python 3.0 y más reciente se basa en simplejson , por lo que me gustaría utilizar en simplejson Python 2.x y json en Python 3.0 y posteriores.

La segunda opción es XML. XML es más complicado y difícil de tan sólo mirar a (o simplemente editar con un editor de texto), pero hay una gran cantidad de herramientas para validarlo, filtrar, editarlo, etc.

Además, si el almacenamiento de datos y sus necesidades de recuperación se convierten en absoluto trivial, considerar el uso de una base de datos real. SQLite es excelente: es pequeño, y para las pequeñas bases de datos corre muy rápido, pero es una base de datos SQL real real. Definitivamente, me gustaría utilizar un ORM Python en lugar de aprender SQL para interactuar con la base de datos; ORM mi favorito para SQLite sería otoño (pequeña y simple), o el ORM de Django (que ni siquiera necesita aprender cómo crear tablas en SQL!) Entonces, si llega a cansarse de SQLite, se puede mover hasta una base de datos real, como PostgreSQL . Si usted se encuentra escribiendo un montón de bucles que buscar a través de los datos guardados, y especialmente si tiene que cumplir dependencias (por ejemplo, si se elimina foo, bar se deben eliminar también) considerar ir a una base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top