我正在編寫一個網站,用戶將在其中進行一些設置,例如他們選擇的顏色方案等。我很樂意將這些設置存儲爲純文本文件,並且安全性不是一個問題。在Python中存儲簡單的用戶設置
我目前看到它的方式是:有一個字典,其中所有的鍵都是用戶,值是用戶設置的字典。
例如,userdb [「bob」] [「colour_scheme」]的值爲「blue」。
將文件存儲在文件上的最佳方式是什麼?醃字典?
有沒有更好的方法來做我想做的事情?
我正在編寫一個網站,用戶將在其中進行一些設置,例如他們選擇的顏色方案等。我很樂意將這些設置存儲爲純文本文件,並且安全性不是一個問題。在Python中存儲簡單的用戶設置
我目前看到它的方式是:有一個字典,其中所有的鍵都是用戶,值是用戶設置的字典。
例如,userdb [「bob」] [「colour_scheme」]的值爲「blue」。
將文件存儲在文件上的最佳方式是什麼?醃字典?
有沒有更好的方法來做我想做的事情?
在詞典上使用cPickle將是我的選擇。字典對於這些類型的數據是非常合適的,所以根據您的要求,我沒有理由不使用它們。除非你正在考慮從非python應用程序讀取它們,在這種情況下,你必須使用語言中性文本格式。甚至在這裏,你可以擺脫泡菜加出口工具。
如果你有一個數據庫,我可能會建議將設置存儲在數據庫中。但是,這聽起來像普通文件可能更適合您的環境。
您可能不想在同一個文件中存儲全部用戶設置,因爲您可能會遇到併發訪問該文件的麻煩。如果您將每個用戶的設置作爲字典存儲在自己的醃文件中,則他們將能夠獨立執行操作。
酸洗是一種合理的方式來存儲這樣的數據,但不幸的是,泡菜數據格式是臭名昭着的不可讀的。你最好將它存儲爲repr(dictionary)
這將是一個更可讀的格式。要重新加載用戶設置,請使用eval(open("file").read())
或類似的東西。
我沒有解決哪個問題最好的問題。如果你想處理文本文件,我會考慮ConfigParser -module。另一個你可以嘗試的將是simplejson或yaml。你也可以考慮一個真正的數據庫表。
例如,你可以有一個表叫userattrs,有三列:
如果只有幾個,你可以將它們存儲到Cookie中以便快速檢索。
以下是最簡單的方法。使用簡單變量和import
設置文件。
調用文件userprefs.py
# a user prefs file
color = 0x010203
font = "times new roman"
position = (12, 13)
size = (640, 480)
在你的應用程序,你需要確保你可以導入此文件。你有很多的選擇。
使用PYTHONPATH
。要求PYTHONPATH
被設置爲包含具有首選項文件的目錄。
a。明確的命令行參數來命名該文件(不是最好的,但簡單)
灣一個命名文件的環境變量。
擴展sys.path
包括用戶的主目錄
例
import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs
print userprefs.color
如果configfiles的人類可讀性 - 重要的替代可能是the ConfigParser module它允許您讀取和寫入的.ini文件一樣。但是,然後你被限制在一個嵌套層次。
的是,有你沒有使用這個數據庫特別的原因?這似乎是正常和自然的事情 - 或者將數據庫中的設置保存在用戶標識符或其他東西上的數據庫中。
您還沒有描述該網站的使用模式,而只是想着綜合性網站 - 但我認爲,保持設置在數據庫中會導致更小的磁盤I/O比使用文件。
OTOH,對於客戶端代碼可能使用的設置,將它們作爲JavaScript存儲在可緩存的靜態文件中將會很方便 - 但要犧牲多處可能的設置。 (我可能會將這些設置存儲在數據庫中,並根據需要重新生成靜態文件)
我同意使用Pickled Dictionary的回覆。在Dictionary結構中存儲簡單數據非常簡單有效。
如果你不在乎能夠自己編輯文件,並且想要一種快速的方式來保存python對象,請使用pickle。如果您確實希望文件可以被人讀取,或者可以被其他應用讀取,請使用ConfigParser。如果您有什麼需要更復雜的,去與某種數據庫中,無論是關係(sqlite),或面向對象(axiom,zodb)。
對於數據庫驅動的網站,當然,最好的選擇是一個數據庫表。我假設你沒有做數據庫的事情。
如果你不關心人類可讀的格式,那麼pickle
是一個簡單而直接的方法。我也聽說過關於simplejson
的好消息。
如果可讀性是很重要的,兩個簡單的選擇出現了:
模塊:只需使用一個模塊。如果你只需要幾個全局變量而沒有任何幻想,那麼這就是要走的路。如果你真的絕望了,你可以定義類和類變量來模擬部分。缺點在於:如果文件將由用戶手動編輯,則錯誤可能難以捕捉和調試。
INI格式:我一直在使用ConfigObj爲此,相當成功。 ConfigObj本質上是ConfigParser的替代品,支持嵌套部分等等。或者,您可以爲文件定義預期的類型或值並進行驗證,爲用戶/管理員提供安全網(以及重要的錯誤反饋)。
我會使用ConfigParser模塊,其產生一些非常可讀和用戶可編輯的輸出爲您的示例:
[bob] colour_scheme: blue british: yes [joe] color_scheme: that's 'color', silly! british: no
下面的代碼會產生上面的配置文件,然後將其打印出來:
import sys
from ConfigParser import *
c = ConfigParser()
c.add_section("bob")
c.set("bob", "colour_scheme", "blue")
c.set("bob", "british", str(True))
c.add_section("joe")
c.set("joe", "color_scheme", "that's 'color', silly!")
c.set("joe", "british", str(False))
c.write(sys.stdout) # this outputs the configuration to stdout
# you could put a file-handle here instead
for section in c.sections(): # this is how you read the options back in
print section
for option in c.options(section):
print "\t", option, "=", c.get(section, option)
print c.get("bob", "british") # To access the "british" attribute for bob directly
請注意,ConfigParser只支持字符串,所以您必須按照上面的布爾值轉換。請參閱effbot以瞭解基礎知識的優點。
內置的sqlite3模塊可能會比大多數替代品簡單得多,並且可以讓您準備好更新到完整的RDBMS,如果您想要或需要的話。
在這種情況下,cPickle的問題是您無法爲一個用戶加載設置,您必須全部加載。貨架規模更好,使用起來也相當簡單。 – 2008-10-16 07:00:48
如果你的字典包含你自己的對象(不只是內置的),那麼你可能會陷入困境。在將來的代碼修訂中,您可能會更改類名或將類移動到其他包中。然後舊數據將不會重組到新代碼中。 – ChrisCantrell 2014-05-30 19:22:41