3

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

我有一个按计划(由 cron)启动的 python 脚本。它读取具有预定义格式的文档 ID 的文件。我需要记住最后处理的文档 ID,以便忽略所有以前的文档 ID(如果有的话)。

4

2 回答 2

4

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

如果您需要结构化存储,那么 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,我只会坚持使用纯文本文件 - 你真的没有比这更兼容的了。

于 2013-03-21T11:01:28.913 回答
1

将其存储在数据库或文件中。您可以选择将其写入文件;您可以选择使用ConfigParseror csv; 或者您可能会选择使用shelve(它很好用且易于使用;如果这就是您想要持久存储的全部,它可能是最直接的)。还有其他选择;看看标准库提供了什么来感受一下。您仍然需要指定要存储结果的文件,并且权限需要适当,但这应该不难。

于 2013-03-21T11:00:24.190 回答