将数据保存为Python模块合理吗?

3 投票
5 回答
673 浏览
提问于 2025-04-15 14:46

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

这样做合理吗?有没有什么大的缺点?我看到的一个优点是,当我想要处理保存的数据时,可以快速导入我需要的模块。而且,这些模块可以和应用的其他部分分开使用,因为你不需要单独的解析器或加载功能。

5 个回答

3

Alex Martelli的回答非常有见地,我非常赞同他的看法。不过,我想进一步推荐一个具体的选择:使用JSON。

JSON很简单,而且Python的数据结构可以很好地转换成JSON格式;而且有很多标准库和工具可以用来处理JSON。在Python 3.0及更新版本中,json模块是基于simplejson的,所以在Python 2.x中我会使用simplejson,而在Python 3.0及更新版本中使用json

第二个选择是XML。XML相对复杂一些,看起来也不太容易(或者用文本编辑器编辑起来比较麻烦),但有很多工具可以用来验证、过滤和编辑XML。

另外,如果你的数据存储和检索需求变得复杂,考虑使用真正的数据库。SQLite非常棒:它体积小,对于小型数据库运行得很快,而且它是真正的SQL数据库。我会推荐使用Python的ORM(对象关系映射)来与数据库交互,而不是学习SQL;我最喜欢的SQLite的ORM是Autumn(小而简单),或者是Django的ORM(你甚至不需要学习如何用SQL创建表!)如果你将来需要更强大的数据库,可以考虑使用PostgreSQL。如果你发现自己写了很多循环来搜索保存的数据,特别是当你需要维护数据之间的依赖关系(比如如果删除foo,bar也必须删除)时,考虑使用数据库会更合适。

7

这样操作虽然能让你获得一些便利,但你要为此付出很多代价。首先,保存数据需要占用更多的空间,同时保存和重新加载数据所需的时间也会大幅增加;而且你的安全风险是无穷无尽的——你必须非常小心你重新加载模块的路径,因为这可能给攻击者提供了一个简单的机会,让他们可以注入他们想要执行的代码,运行在你的用户身份下(pickle 本身在安全性上并不是特别可靠,但相比这种做法,它就显得很不错了;-)。

总的来说,我更喜欢一种简单而传统的方式:可执行的代码放在一个模块里(在一个典型的代码加载路径上,这个模块编译后就不需要再读写了)——它只需加载一次,并且是从已经编译好的形式中加载。数据则存放在自己的文件中(或者数据库的某些部分等),使用许多合适的格式,主要是标准格式(如果我想将来能方便地从其他语言加载这些数据,也可以使用多种语言的格式,比如 JSON、CSV、XML 等等)。

3

这样做是合理的,我经常这么做。显然,这不是用来交换数据的格式,所以不适合用作保存文件。

比如,当我把网站迁移到Plone时,我常常会得到一些关于网站的数据(比如需要迁移的页面列表,或者旧网址如何映射到新网址的列表,还有标签的列表)。这些数据通常是以Word或Excel格式提供的。而且这些数据往往需要稍微处理一下,最后我得到的实际上就是一个字典,把一个网址映射到一些其他信息。

当然,我可以把这些数据保存为CSV格式,然后解析成字典。但我通常会把它保存为一个Python文件,里面直接写一个字典。这样可以省去一些代码。

所以,是的,这样做是合理的,但这不是你应该用来保存任何文件的格式。不过,它经常用于一些介于数据和配置之间的数据,就像上面提到的那样。

撰写回答