代码之家  ›  专栏  ›  技术社区  ›  Andrei Vajna II

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

  •  3
  • Andrei Vajna II  · 技术社区  · 15 年前

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

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

    5 回复  |  直到 12 年前
        1
  •  3
  •   Lennart Regebro    15 年前

    这是合理的,我一直这样做。显然,它不是用于交换数据的格式,因此对于类似保存文件的任何内容来说,它都不是一种好的格式。

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

    当然,我 能够 将其保存为cvs,并将其解析为字典。但是我通常用字典将其保存为python文件。保存代码。

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

        2
  •  7
  •   Alex Martelli    15 年前

    通过这种方式,你可以获得一些便利,但你为此付出了很多代价。保存数据所需的空间,以及保存和重新加载数据所需的时间都会大大增加;而且您的安全暴露是无限制的——您必须严格保护您重新加载模块的路径,因为这将为任何攻击者提供一条简单的途径,让其在您的userid下注入自己选择的代码。( pickle 它本身并不是坚如磐石的,安全方面的,但是,与这种安排相比,它闪耀着;-)。

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

        3
  •  3
  •   Tirpen    15 年前

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

        4
  •  3
  •   SingleNegationElimination    15 年前

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

        5
  •  3
  •   steveha    15 年前

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

    JSON很简单,而且Python的数据结构可以很好地映射到JSON中;有几个标准库和工具可以使用JSON。这个 json python 3.0及更新版本中的模块基于 simplejson ,所以我会用 simplejson 在python 2.x和 杰森 在python 3.0及更高版本中。

    第二个选择是XML。XML更复杂,更难仅仅查看(或者只使用文本编辑器进行编辑),但是有大量的工具来验证它、过滤它、编辑它等等。

    另外,如果您的数据存储和检索需求变得非常重要,那么考虑使用实际的数据库。 SQLite 非常好:它很小,对于小型数据库运行非常快,但它是真正的SQL数据库。我肯定会使用Python ORM而不是学习SQL来与数据库交互;我最喜欢的SQLite ORM是 Autumn (小而简单),或来自 Django (您甚至不需要学习如何在SQL中创建表!)如果超过sqlite,就可以向上移动到真正的数据库,例如 PostgreSQL .如果您发现自己编写了许多搜索已保存数据的循环,特别是如果需要强制执行依赖项(例如,如果删除foo,则也必须删除bar),请考虑转到数据库。