2013-03-21 64 views
1

有沒有辦法在Python中擁有「最後一次知道」計數器,並在服務器重新啓動後生存下來?如何在Python中實現持久性計數器

我有一個按計劃(通過cron)啓動的python腳本。它以預定義的格式讀取帶有文檔ID的文件。我需要記住最後處理的文檔ID,以便如果有的話忽略所有以前的文檔。

+1

將其保存在數據庫中/文件? – Ben 2013-03-21 10:48:50

+0

我寧願不安裝Oracle,只保存一個計數器:)尋找一個輕量級的解決方案:) – Antonio 2013-03-21 10:49:32

+0

至於文件,這是一個好主意,但不是跨平臺。 – Antonio 2013-03-21 10:50:09

回答

1

將其存儲在數據庫或文件中。您可以選擇將其寫入文件;您可以選擇使用ConfigParsercsv;或者您可能選擇使用shelve(使用起來非常簡單;如果這是您想要的永久存儲,那可能是最直接的)。還有其他的選擇;看看standard library提供什麼樣的感覺。您仍然需要指定您希望存儲結果的文件,並且權限需要適當,但這應該不困難。

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通常被認爲比LBYL更Python),但如果你希望明確的檢查,比如說,文件存在,那麼很容易在便攜式的方式太:

if not os.path.exists(DATA_FILENAME): 
    print "No file found. Deal with it." 

如果您需要稍後添加更多數據字段,我建議SQLite - 它方便,強大,並且允許您與其他語言的應用程序進行交互操作,以便將來使用。另外,如果需要,還可以使用獨立的SQLite命令行客戶端來操作數據。你只需要提供一個文件名到sqlite3.connect()方法,所以它就像打開一個文件一樣簡單,只是你可以把SQL扔在它上面。

但是,對於一個簡單的單一ID,我只是堅持一個純文本文件 - 你真的沒有那麼多兼容。

+0

我會考慮在標準庫中使用'shelve'模塊,比這更簡單。 – 2013-03-21 11:10:31

+0

是的,對於像這樣的簡單情況,'shelve'完全沒有問題。我個人更喜歡明文文件或SQLite文件,因爲它們更容易支持其他語言,但我完全接受OP沒有將其作爲要求指定。他對跨平臺解決方案的關注使我認爲,跨語言解決方案可能會吸引他,就是這樣。對於結構化數據,'shelve'確實比滾動自己的純文本格式好 - 我個人更喜歡SQLite,除非我需要存儲Python類或類似的東西(當然,「shelve」更好)。 – Cartroo 2013-03-21 11:13:51

+0

而且很可能會有其他持久性數據需求已經存在或將會彈出。一個合適的數據庫肯定會是一個明智的想法。像'ConfigParser'這樣的東西比'shelve'更容易跨語言。 – 2013-03-21 11:16:19