这就是我为一个项目所做的。我有一些基本上是字典的数据结构,其中一些方法对数据进行操作。当我将它们保存到磁盘时,我将它们写为.py文件作为代码,当作为模块导入时,会将相同的数据加载到这样的数据结构中。
这合理吗?有什么大的缺点吗?我看到的优点是,当我想使用保存的数据进行操作时,我可以快速导入我需要的模块。此外,模块可以与应用程序的其余部分分开使用,因为您不需要单独的解析器或加载器功能。
答案 0 :(得分:7)
通过这种方式操作,您可能会获得一些便利,但您需要支付多种价格。保存数据所需的空间以及保存和重新加载数据所需的时间大幅增加;并且您的安全风险是无限制的 - 您必须严格保护重新加载模块的路径,因为它可以为任何攻击者提供一个简单的途径来注入他们选择的代码以在您的用户ID下执行(pickle
本身是安全性不是坚如磐石的,但是,与这种安排相比,它会闪耀; - )。
总而言之,我更喜欢更简单和更传统的安排:可执行代码存在于一个模块中(在典型的代码加载路径上,一旦模块编译就不需要R / W) - 它被加载只有一次,来自已编译的表格。数据以任何合适的格式存在于他们自己的文件(或DB等部分)中,大多数是标准格式(可能包括多语言文件,如JSON,CSV,XML,......等等,如果我想要的话)保持选项打开,以便将来轻松加载其他语言的数据。)
答案 1 :(得分:3)
最大的缺点是它是一个潜在的安全问题,因为很难保证文件不会包含任意代码,这可能非常糟糕。因此,如果除了您以外的任何人对文件具有写入权限,请不要使用此方法。
答案 2 :(得分:3)
合理的选择可能是使用Pickle模块,该模块专门用于将python结构保存和恢复到磁盘。
答案 3 :(得分:3)
这是合理的,我一直这样做。显然,它不是用于交换数据的格式,因此对于像保存文件这样的东西来说,它不是一个好的格式。
但是,例如,当我将网站迁移到Plone时,我经常会获得有关该网站的数据(例如应该迁移哪些页面的列表,或者应该将旧网址映射到新网站的列表,aor标签列表)。这些通常是Word och Excel格式。此外,数据通常需要按摩一点,我最终得到的是所有意图和目的是将一个URL映射到其他信息的字典。
当然,我可以将其保存为CVS,并将其解析为字典。但我通常将其保存为带有字典的Python文件。保存代码。
所以,是的,这是合理的,不,它不是你应该用于任何类型的保存文件的格式。然而,它常常用于跨越边界的数据,如上所述。
答案 4 :(得分:3)
JSON很简单,Python的数据结构很好地映射到它;并且有几个标准库和工具用于使用JSON。 Python 3.0及更高版本中的json
模块基于simplejson,因此我将在Python 2.x中使用simplejson
,在Python 3.0及更新版本中使用json
。
第二种选择是XML。 XML更复杂,更难以查看(或只是使用文本编辑器进行编辑),但有大量工具可用于验证,过滤,编辑等。
此外,如果您的数据存储和检索需求变得非常重要,请考虑使用实际的数据库。 SQLite非常棒:它很小,而且对于小型数据库运行速度非常快,但它是一个真正的实际SQL数据库。我肯定会使用Python ORM而不是学习SQL来与数据库交互;我最喜欢的SQLM ORM是Autumn(小而简单),或来自Django的ORM(你甚至不需要学习如何在SQL中创建表格!)然后如果你曾经超过SQLite ,您可以升级到真实的数据库,例如PostgreSQL。如果您发现自己编写了大量循环来搜索已保存的数据,特别是如果您需要强制执行依赖项(例如,如果foo被删除,bar也必须删除),请考虑转到数据库。