有没有办法让 Python 中的“最后一个已知”计数器在服务器重启后仍然存在?
我有一个按计划(由 cron)启动的 python 脚本。它读取具有预定义格式的文档 ID 的文件。我需要记住最后处理的文档 ID,以便忽略所有以前的文档 ID(如果有的话)。
有没有办法让 Python 中的“最后一个已知”计数器在服务器重启后仍然存在?
我有一个按计划(由 cron)启动的 python 脚本。它读取具有预定义格式的文档 ID 的文件。我需要记住最后处理的文档 ID,以便忽略所有以前的文档 ID(如果有的话)。
您希望在重新启动后仍然存在的任何值都需要放入持久存储中 - 即磁盘。这意味着某种文件,无论是简单的纯文本文件还是数据库文件,都取决于您。您在评论中表示您不认为这是“跨平台”,但它确实是一个没有某种文件系统支持的奇怪平台。
如果您需要结构化存储,那么 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通常被认为比LBYL更 Pythonic ),但如果你想显式检查文件是否存在,那么这也很容易以可移植的方式进行:
if not os.path.exists(DATA_FILENAME):
print "No file found. Deal with it."
如果您以后需要添加更多数据字段,我建议使用 SQLite - 它方便、健壮,并且允许您与其他语言的应用程序进行互操作,如果将来需要的话。此外,如果需要,您可以使用独立的 SQLite 命令行客户端来操作数据。您只需为该sqlite3.connect()
方法提供一个文件名,因此它本质上就像打开文件一样简单,只是您可以向它抛出 SQL。
但是,对于一个简单的单一 ID,我只会坚持使用纯文本文件 - 你真的没有比这更兼容的了。