如何在Python中实现持久计数器
有没有办法在Python中设置一个“最后已知”的计数器,让它在服务器重启后还能继续使用?
我有一个Python脚本是定时运行的(通过cron)。这个脚本会读取一些文件,这些文件里有按照特定格式写的文档ID。我需要记住最后处理过的文档ID,这样如果有之前的文档ID,就可以忽略掉它们。
2 个回答
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,我建议还是用文本文件——这真的是最兼容的选择了。