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

3 投票
2 回答
2185 浏览
提问于 2025-04-17 19:52

有没有办法在Python中设置一个“最后已知”的计数器,让它在服务器重启后还能继续使用?

我有一个Python脚本是定时运行的(通过cron)。这个脚本会读取一些文件,这些文件里有按照特定格式写的文档ID。我需要记住最后处理过的文档ID,这样如果有之前的文档ID,就可以忽略掉它们。

2 个回答

1

可以把它存储在数据库里或者文件中。你可以选择把数据写入一个文件;也可以选择使用 ConfigParsercsv;或者你也可以使用 shelve(这个用起来简单方便;如果你只是想要一个持久存储,这可能是最简单的选择)。当然还有其他的选项;你可以看看 标准库 提供了什么,了解一下。你还需要指定你想把结果存储到哪个文件里,并且确保你有合适的权限,这些应该都不难。

5

任何你想在重启后保留的值,都需要存储在持久化存储中,也就是硬盘。这意味着你需要用某种文件来保存这些值,无论是简单的文本文件还是数据库文件,选择权在你。你在评论中提到你觉得这不“跨平台”,但如果一个平台连文件系统都不支持,那真是奇怪。

如果你需要结构化的存储,Python自带的sqlite3模块就支持SQLite。不过,听起来你只是需要存储一个简单的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通常被认为比LBYL更符合Python风格),不过如果你想明确检查文件是否存在,那也是很简单的:

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

如果你以后需要添加更多的数据字段,我建议使用SQLite——它方便、可靠,并且如果将来需要和其他语言的应用程序互操作也很容易。而且,如果需要,你可以使用独立的SQLite命令行客户端来操作你的数据。你只需给sqlite3.connect()方法提供一个文件名,基本上就像打开一个文件一样简单,只不过你可以对它执行SQL命令。

不过,对于一个简单的单个ID,我建议还是用文本文件——这真的是最兼容的选择了。

撰写回答