Question

est ce que je l'ai fait pour un projet. J'ai quelques structures de données qui sont bascially dictionnaires avec des méthodes qui fonctionnent sur les données. Lorsque je les enregistrer sur le disque, je les écrire dans des fichiers .py comme code lorsqu'ils sont importés en tant que module charge les mêmes données dans une telle structure de données.

Est-ce raisonnable? Y a-t-il des gros inconvénients? L'avantage que je vois est que lorsque je veux travailler avec les données enregistrées, je peux importer rapidement les modules dont j'ai besoin. En outre, les modules peuvent être utilisés séparé du reste de l'application parce que vous n'avez pas besoin d'un analyseur séparé ou fonctionnalité chargeur.

Était-ce utile?

La solution

Il est raisonnable, et je le fais tout le temps. Il est évident que ce n'est pas un format que vous utilisez pour échanger des données, il est donc pas un bon format pour quoi que ce soit comme un fichier de sauvegarde.

Mais par exemple, quand je fais des migrations de sites Web pour Plone, je reçois souvent des données sur le site (par exemple une liste dont les pages doivent migrer, ou une liste de quel âge urls doivent être mis en correspondance avec de nouveaux, AOR listes de balises). Ceux-ci vous obtenez généralement dans Word och format Excel. Aussi les données doivent souvent masser un peu, et je finis avec ce que pour toutes fins utiles sont un mappage de dictionnaires une URL à d'autres informations.

Bien sûr, je pourrait save que CVS, et l'analyser dans un dictionnaire. Mais au lieu que je sauve en général comme un fichier Python avec un dictionnaire. code enregistre.

Alors, oui, il est raisonnable, non ce n'est pas un format que vous devez utiliser pour toute sorte de fichier de sauvegarde. Il a cependant souvent utilisé pour les données qui chevauche la frontière entre la configuration, comme ci-dessus.

Autres conseils

En opérant de cette façon, vous pouvez gagner un peu de commodité minimum, mais vous payez de nombreux types de prix pour cela. L'espace qu'il faut pour sauvegarder vos données, et le temps qu'il faut à la fois enregistrer et recharger, monter substantiellement; et l'exposition de votre sécurité est Unbounded - vous devez férocement garder les chemins dont vous rajoutez des modules, car elle fournirait un moyen facile pour tout attaquant d'injecter du code de leur choix à exécuter sous votre code d'utilisateur (pickle lui-même est pas solide comme le roc , sage sécurité, mais, par rapport à cette disposition, il brille; -).

Dans l'ensemble, je préfère un simple et l'arrangement plus traditionnel: code exécutable vit dans un module (sur un chemin le chargement du code typique, qui n'a pas besoin d'être R / W une fois compilé ce module) - il devient chargé juste une fois et d'une forme déjà compilé. Les données vivent dans leurs propres fichiers (ou des parties de DB, etc.) dans l'un des nombreux formats appropriés, pour la plupart les standards (y compris éventuellement les multi-langue tels que JSON, CSV, XML, ... etc., si je veux garder l'option ouverte pour charger facilement à l'avenir les données d'autres langues).

Le plus gros inconvénient est que c'est un problème de sécurité potentiel car il est difficile de garantir que les fichiers ne contient du code arbitraire, ce qui pourrait être vraiment mauvais. Donc, ne pas utiliser cette approche si quelqu'un d'autre que vous avez accès en écriture aux fichiers.

Une option raisonnable pourrait être d'utiliser le module de Pickle , qui est spécialement conçu pour sauvegarder et restaurer les structures de python sur le disque.

La réponse de Alex Martelli est absolument perspicace et je suis d'accord avec lui. Cependant, je vais aller un peu plus loin et faire une recommandation spécifique:. Utiliser JSON

JSON est simple, et les structures de données de Python carte bien en elle; et il y a plusieurs bibliothèques standard et des outils pour travailler avec JSON. Le module json en Python 3.0 et plus récent est basé sur simplejson , donc j'utiliser dans simplejson Python 2.x et json en Python 3.0 et plus récent.

Second choix XML. XML est plus compliqué et plus difficile de simplement regarder (ou tout simplement modifier avec un éditeur de texte) mais il y a une grande richesse d'outils pour valider, filtrer, modifier, etc.

En outre, si vos besoins de stockage et de récupération de données deviennent tout nonbanal, envisagez d'utiliser une base de données réelle. SQLite est formidable: il est petit, et pour les petites bases de données fonctionne très vite, mais il est une véritable base de données SQL réelle. Je certainement utiliser un Python ORM au lieu d'apprendre SQL pour interagir avec la base de données; mon ORM pour SQLite serait Automne (petit et simple), ou l'ORM Django (vous ne devez même pas apprendre à créer des tables dans SQL!) Alors si jamais vous dépassez SQLite, vous pouvez déplacer jusqu'à une véritable base de données tels que PostgreSQL . Si vous vous trouvez à écrire beaucoup de boucles qui recherche à travers vos données sauvegardées, et surtout si vous avez besoin de faire respecter les dépendances (par exemple si foo est supprimé, la barre doit être supprimé aussi) envisager d'aller à une base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top