【问题标题】:Is something like ConfigParser appropriate for saving state (key, value) between runs?像 ConfigParser 这样的东西是否适合在运行之间保存状态(键、值)?
【发布时间】:2010-10-29 08:13:01
【问题描述】:

我想在 Python 程序的运行之间保存一组键、值对(字符串、整数),在后续运行时重新加载它们,并将更改写入下次运行时可用。

我不认为这些数据是配置文件,但它非常适合 ConfigParser 功能。我只需要两个[部分]。只有几百对,而且非常简单,所以我认为没有必要做一个实际的数据库。

这样使用ConfigParser合适吗?我也考虑过使用 Perl 和 XML::Simple。那个怎么样?有没有办法在没有 Python 或 Perl 的 bash 中做到这一点?

【问题讨论】:

    标签: python xml perl configparser


    【解决方案1】:

    嗯,你有更好的选择。例如,您可以使用 picklejson 格式。 Pickle 序列化模块非常好用。

    import cPickle
    cPickle.dump(obj, open('save.p', 'wb')) 
    obj = cPickle.load(open('save.p', 'rb'))
    

    该格式不是人类可读的,并且 unpickling 对错误或恶意构造的数据不安全。您不应该解开不受信任的数据。

    如果您使用的是 python 2.6,则有一个名为 json 的内置模块。使用起来就像泡菜一样简单:

    import json
    encoded = json.dumps(obj)
    obj = json.loads(encoded)
    

    Json 格式是人类可读的,与 python 中的字典字符串表示非常相似。并且不存在pickle之类的安全问题。

    如果您使用的是较早版本的 python,您可以改为 simplejson

    【讨论】:

      【解决方案2】:

      对我来说,PyYAML 非常适合这类事情。我以前用过pickle或者ConfigParser。

      【讨论】:

      • 我是 YAML 粉丝。它是人类可读的、跨平台的(Python、Perl、C 等),并且与 JSON 兼容。
      • @Michael:是的,每个 JSON 文件都是有效的 YAML(请参阅 yaml.org/spec/1.2/#id2560236
      • YAML 很棒,尤其是对于配置文件,因为它易于阅读。对于不需要人眼的东西,json应该已经足够好了,因为它现在是python发行版的一部分。
      【解决方案3】:

      ConfigParser 是一种很好的方法。还有其他方法(已经提到的 json 和 cPickle 模块可能很有用)也很好,这取决于您是否想要文本文件或二进制文件以及您是否希望代码仅在旧版本的 Python 中工作。

      您可能希望在您选择的方式之上有一个薄抽象层,以便更容易改变您的想法。

      【讨论】:

        【解决方案4】:

        听起来像是dbm 的工作。基本上它是一个存在于您的程序外部的哈希。有很多实现。在 Perl 中,tie a dbm to a hash 是微不足道的(即让它看起来像一个 dbm 真的是一个普通的散列变量)。我不知道 Python 中是否有任何等效机制,但如果没有,我会感到惊讶。

        【讨论】:

        【解决方案5】:

        在 bash 中重新做:如果你的字符串是有效的标识符,你可以使用环境变量和env

        【讨论】:

          【解决方案6】:

          如果您可以逐键更新状态键,那么任何 DBM 数据库都可以工作。如果您需要真正的高性能和紧凑的存储空间,那么 Tokyo Cabinet - http://tokyocabinet.sourceforge.net/ 是一款很酷的玩具。

          如果您想一次保存和加载整个内容(可能保留旧版本或类似的内容)并且没有太多数据,那么只需使用 JSON。它比 XML 好用得多。我不知道 JSON 在 Python 中的实现如何,但在 Perl 中 JSON::XS 模块非常快。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-28
            • 1970-01-01
            • 2011-01-24
            • 1970-01-01
            • 2013-05-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多