如何在Python中实现持久性计数器

时间:2013-03-21 10:47:10

标签: python

有没有办法让Python中的“最后一个已知”计数器在服务器重启后能够存活?

我有一个按计划启动的python脚本(由cron提供)。它以预定义的格式读取包含文档ID的文件。我需要记住上次处理的文档ID,以便忽略所有以前的文件ID。

2 个答案:

答案 0 :(得分:3)

您希望在重新启动后存活的任何值都需要放入持久存储 - 即磁盘。这意味着某种文件,无论是简单的纯文本文件还是数据库文件都取决于您。你在评论中指出你不觉得这是“跨平台”,但它确实是一个奇怪的平台,确实没有某种文件系统支持。

如果您需要结构化存储,那么SQLite支持内置Python的sqlite3模块。但是,听起来你只需要存储一个ID,这样一个简单的文件就足够了。我建议这样的事情:

import os

DATA_FILENAME = os.path.expanduser("~/document-counter.txt")

def update_document_id(new_id):
    with open(DATA_FILENAME, "w") as fd:
        fd.write(new_id + "\n")

def retrieve_document_id():
    with open(DATA_FILENAME, "r") as fd:
        return fd.readline().strip()

您应该做更好的错误检查(例如,如果文件不存在,请捕获引发的异常等),但这可以让您了解解决方案的简单性。你最好去捕捉异常(EAFP通常被认为比Pythonic更加LBYL)但是如果你想明确地检查文件存在,那么这也很容易以便携的方式进行:

if not os.path.exists(DATA_FILENAME):
    print "No file found. Deal with it."

如果您以后需要添加更多数据字段,我建议使用SQLite - 它既方便又强大,并且允许您在将来需要时与其他语言的应用程序进行互操作。另外,如果需要,您可以使用独立的SQLite命令行客户端来操作数据。你只需要为sqlite3.connect()方法提供一个文件名,这样就像打开一个文件一样简单,只需你可以在它上面输入SQL。

然而,对于一个简单的单一ID,我只是坚持使用纯文本文件 - 你真的没有那么多兼容。

答案 1 :(得分:1)

将其存储在数据库或文件中。您可以选择将其写入文件;您可以选择使用ConfigParsercsv;或者您可以选择使用shelve(这很好用且简单易用;如果您只想要持久存储,那么它可能是最直接的)。还有其他选择;看看standard library提供的内容,以便了解它。您仍然需要指定要存储结果的文件,并且权限需要适当,但这应该不难。