Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据保存为python模块是否合理?_Python_Data Persistence_Dynamic Import - Fatal编程技术网

将数据保存为python模块是否合理?

将数据保存为python模块是否合理?,python,data-persistence,dynamic-import,Python,Data Persistence,Dynamic Import,这就是我为一个项目所做的。我有一些数据结构,基本上是字典,其中包含一些对数据进行操作的方法。当我将它们保存到磁盘时,我将它们作为代码写入.py文件,当作为模块导入时,将相同的数据加载到这样的数据结构中 这合理吗?有什么大的缺点吗?我看到的优点是,当我想使用保存的数据进行操作时,我可以快速导入所需的模块。此外,模块可以与应用程序的其他部分分开使用,因为您不需要单独的解析器或加载程序功能。最大的缺点是,这是一个潜在的安全问题,因为很难保证文件不会包含任意代码,这可能非常糟糕。因此,如果除您之外的任何

这就是我为一个项目所做的。我有一些数据结构,基本上是字典,其中包含一些对数据进行操作的方法。当我将它们保存到磁盘时,我将它们作为代码写入.py文件,当作为模块导入时,将相同的数据加载到这样的数据结构中


这合理吗?有什么大的缺点吗?我看到的优点是,当我想使用保存的数据进行操作时,我可以快速导入所需的模块。此外,模块可以与应用程序的其他部分分开使用,因为您不需要单独的解析器或加载程序功能。

最大的缺点是,这是一个潜在的安全问题,因为很难保证文件不会包含任意代码,这可能非常糟糕。因此,如果除您之外的任何人都有文件的写入权限,请不要使用这种方法。

一个合理的选择可能是使用该模块,该模块专门设计用于将python结构保存和恢复到磁盘。

这是合理的,我一直都在这样做。很明显,它不是用来交换数据的格式,所以它不是保存文件之类的好格式

但是,例如,当我将网站迁移到Plone时,我经常会得到有关该网站的数据(例如,应该迁移哪些页面的列表,或者旧URL应该映射到新URL的列表,或标记的aor列表)。这些文件通常采用Word och Excel格式。此外,数据通常需要进行一些处理,最终我得到了一个字典,它将一个URL映射到其他一些信息

当然,我可以将其保存为CVS,并将其解析到字典中。但我通常会将其保存为一个带有字典的Python文件。保存代码


所以,是的,它是合理的,不,它不是任何类型的保存文件都应该使用的格式。然而,它通常用于跨越配置边界的数据,如上文所述。

通过这种方式操作,您可能会获得一些便利,但您为此付出了多种代价。保存数据所需的空间以及保存和重新加载数据所需的时间大幅增加;而且您的安全暴露是无限的——您必须严格保护从中重新加载模块的路径,因为这将为任何攻击者提供一个简单的途径,让他们选择在您的用户ID下执行代码(
pickle
本身并不是坚如磐石的、安全的,但与这种安排相比,它非常出色;-)


总而言之,我更喜欢一种更简单、更传统的安排:可执行代码存在于一个模块中(在典型的代码加载路径上,模块编译后不需要R/W)——它只加载一次,并且从已经编译的表单加载。数据以多种合适的格式(主要是标准格式)存在于它们自己的文件(或数据库的一部分等)中(可能包括多种语言的格式,如JSON、CSV、XML等,如果我想保持选项打开,以便将来从其他语言轻松加载这些数据).

亚历克斯·马泰利的回答非常有洞察力,我同意他的看法。不过,我将进一步提出一个具体建议:使用JSON

JSON很简单,Python的数据结构映射得很好;还有几个用于处理JSON的标准库和工具。Python 3.0及更新版本中的
json
模块基于,因此我将在Python 2.x中使用
simplejson
,在Python 3.0及更新版本中使用
json

第二种选择是XML。XML更复杂,更难直接查看(或用文本编辑器编辑),但有大量的工具来验证、过滤、编辑等等


此外,如果您的数据存储和检索需要变得几乎不重要,请考虑使用实际数据库。非常好:它很小,对于小型数据库来说运行速度非常快,但它是一个真正的SQL数据库。我肯定会使用Python ORM,而不是学习SQL与数据库交互;我最喜欢的SQLite的ORM是(小而简单),或者是来自(你甚至不需要学习如何在SQL中创建表!)的ORM,然后如果你曾经超过SQLite,你可以升级到一个真正的数据库,比如。如果您发现自己编写了许多循环来搜索您保存的数据,尤其是如果需要强制依赖性(例如,如果FO被删除,也必须删除BAR),请考虑进入数据库。< / P>不,我不担心其他人修改文件。但存在相同的安全问题。而且不容易编辑。容易编辑很好:无论如何,我知道Pickle,但这不是问题所在。您提到的两个优点都是能够独立于任何“加载程序”代码加载数据——并且使用来自标准或第三方库(Pickle、SimpleJSON、YAML等)的加载程序也可以为您带来这一优势。默认情况下,Python还将输出.pyc文件,这将使数据总量几乎翻一番。一般来说,这是一个很好的主意。您考虑过sqlite吗?感谢所有的技术和解释。我并不是全都认识。