有没有办法让Python中的“最后一个已知”计数器在服务器重启后能够存活?
我有一个按计划启动的python脚本(由cron提供)。它以预定义的格式读取包含文档ID的文件。我需要记住上次处理的文档ID,以便忽略所有以前的文件ID。
答案 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)
将其存储在数据库或文件中。您可以选择将其写入文件;您可以选择使用ConfigParser
或csv
;或者您可以选择使用shelve
(这很好用且简单易用;如果您只想要持久存储,那么它可能是最直接的)。还有其他选择;看看standard library提供的内容,以便了解它。您仍然需要指定要存储结果的文件,并且权限需要适当,但这应该不难。