【问题标题】:Best method of saving data保存数据的最佳方法
【发布时间】:2013-01-08 16:14:40
【问题描述】:

我创建了一个班级,我想在其中跟踪学生的统计数据。我打算稍后制作一个 GUI 来操作这些数据。

我的主要问题是:保存和稍后检索这些数据的最佳方法是什么?

我读过有关 pickle 和 JSON 的文章,但我并不真正了解它们是如何工作的(尤其是关于它们如何保存数据,例如以哪种格式和在何处保存)。

【问题讨论】:

  • 有什么理由不使用 Python 自带的 sqlite?
  • 存储和检索数据称为“序列化”,我冒昧地将其添加到标签中。使用网络搜索(或下面的 Lazyweb 的 Powerz),您会发现很多关于该主题的信息。

标签: python serialization save


【解决方案1】:

如果您的数据非常简单,例如字符串或数字集合的集合,我会使用 json. JSON是什么,是简单数据类型和简单数据类型组合的字符串表示。使用json 模块将数据转换为字符串后,您可以自己将其写入文件。

超级简单:

>>> my_data = [range(5) for i in range(5)]
>>> my_data
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
>>> import json
>>> json.dumps(my_data)
'[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]'

然后将该字符串写入文件。当你想重新加载它时,像这样:

>>> import json
>>> string_from_file
'[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]'
>>> my_saved_data = json.loads(string_from_file)
>>> my_saved_data
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

如果你的数据比较复杂,并且涉及到内置集合对象以外的类,pickle 是更好的选择。关于 pickle,需要了解的非常重要的一件事是,pickle 中存在安全漏洞,如果您自己没有 pickle 则解开任何内容是个坏主意。 pickle 容易受到本文详述的安全问题的影响:http://www.kalzumeus.com/2013/01/31/what-the-rails-security-issue-means-for-your-startup/

如果您的数据非常大,或者您将经常保存/加载它,或者出于任何原因使用 json 并保存到本地文件是不够的,那么数据库将是您的最佳选择。

【讨论】:

  • 我认为 JSON 是一个不错的选择。就复杂性而言,它介于 CSV 和 XML 之间。我认为 CSV 对于许多用途来说有点过于简单,很难在其中表示“自然”结构。 XML 的优点是一切和 kitchensink 都可以导入/导出它或将其用作协议库,因此它是一种强大的元格式,但也更复杂。
  • JSON 的好处在于,与 Pickle 不同,它与语言无关。
  • 这个答案是我会推荐给这里的任何人的答案。另外,如果你有 numpy 数组等,json-tricks 是一个非常好的包。
  • 也许还提到,即使在不同的 Python 版本之间,泡菜也可能不兼容。
【解决方案2】:

对于持久性数据(存储有关学生的信息),数据库是一个不错的选择。如前所述,Python 附带 Sqlite3,这通常足够好,至少对于开发目的而言。

将 Sqlite 引入 Python 很容易 - 只需在源代码文件中导入库并打开与数据库的连接即可。参考pythondocumentation

编辑:发现 a new tutorial 关于 Python + Sqlite 似乎不错。

【讨论】:

    【解决方案3】:

    您也可以使用csv files 模块。这取决于你需要什么。

    【讨论】:

    • CSV 的问题在于它不适合结构化数据。如果您可以只保存一个二维数组(或少数数组,如果您为每个数组使用单独的 CSV 文件),那么 CSV 就可以了;但它不适合在单个字段中具有更多维度或结构的任何内容。
    【解决方案4】:

    使用数据库。带有 SQLight 的 SQLAlchemy 是一个好的开始。无论如何,你最终会在那里结束。

    使用 pickle 模块将所有内容转储出去。 (真的没什么好理解的,你先保存对象再加载,真的很简单)。

    【讨论】:

      【解决方案5】:

      您可以使用pickling,Python 的序列化机制:

      pickle 模块实现了一种基本但强大的算法,用于序列化和反序列化 Python 对象结构。 “Pickling”是将 Python 对象层次结构转换为字节流的过程,而“unpickling”是逆操作,从而将字节流转换回对象层次结构。酸洗(和解酸)也称为“序列化”、“编组”[1] 或“扁平化”,但为避免混淆,此处使用的术语是“酸洗”和“解酸”。

      【讨论】:

      • Pickles 适合短期本地存储,但不能很好地扩展到大数据量、网络并发和/或不同的 Python 版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 2012-06-02
      • 2011-12-13
      相关资源
      最近更新 更多