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

如何在Python中实现持久计数器,python,Python,有没有一种方法可以让Python中的“最后一个已知”计数器在服务器重新启动后继续存在 我有一个按计划(由cron)启动的python脚本。它以预定义的格式读取带有文档ID的文件。我需要记住上次处理的文档ID,以便忽略以前的所有文档ID(如果有)。将其存储在数据库或文件中。您可以选择将其写入文件;您可以选择使用ConfigParser或csv;或者您可以选择使用(它很好而且使用简单;如果这就是您想要持久存储的全部,那么它可能是最简单的)。还有其他选择;看一看它提供了什么来感受它。您仍然需要指定要将

有没有一种方法可以让Python中的“最后一个已知”计数器在服务器重新启动后继续存在


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

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

任何要在重新启动后存活的值都需要放入永久性存储中,即磁盘。这意味着某种类型的文件,无论是简单的纯文本文件还是数据库文件,都由您决定。您在评论中指出,您不认为这是“跨平台的”,但如果没有某种文件系统支持,这将是一个奇怪的平台

如果您需要结构化存储,那么SQLite支持是Python模块内置的。不过,听起来您只需要存储一个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()
您可能应该做更好的错误检查(例如,捕获文件不存在时抛出的异常等),但这让您知道解决方案有多简单。您最好捕获异常(通常被认为更像Pythonic,而不是Pythonic),但是如果您想显式地检查(比如)文件是否存在,那么以可移植的方式也很容易:

if not os.path.exists(DATA_FILENAME):
    print "No file found. Deal with it."
如果您以后需要添加更多的数据字段,我建议使用SQLite—它方便、健壮,并允许您在将来需要时与其他语言的应用程序进行互操作。此外,如果需要,还可以使用独立的SQLite命令行客户端来操作数据。您只需为
sqlite3.connect()
方法提供一个文件名,这样基本上就像打开一个文件一样简单,只是您可以向它抛出SQL


然而,对于一个简单的单一ID,我只会选择一个纯文本文件-你真的没有比这更兼容的了。

将其保存在数据库/文件中?我不希望安装Oracle只保存一个计数器:)寻找一个轻量级解决方案:)至于文件,这是个好主意,但不是跨平台的。什么?保存到文件不是跨平台的?如何?@安东尼奥:不管你安排什么,你都需要访问某个可写的位置。在标准库中,我会考虑使用<代码>搁置< /COD>模块,比这更简单。是的,对于这样的简单情况,代码< >搁置< /C>完全没有错。就我个人而言,我更喜欢纯文本文件或SQLite文件,因为它们在其他语言中更容易支持,但我完全接受OP没有将其指定为要求。他对跨平台解决方案的关注让我想到,也许跨语言解决方案可能会吸引他,仅此而已。对于结构化数据,
shelve
肯定比滚动您自己的纯文本格式要好——我个人更喜欢SQLite,除非我需要存储Python类或类似的类(当然,
shelve
更好)。而且很可能还有其他已经存在或将弹出的持久数据需求。一个合适的数据库肯定是一个明智的想法。像
ConfigParser
这样的东西比
shelve
更容易跨语言。