2008-10-14 31 views
7

我正在編寫一個網站,用戶將在其中進行一些設置,例如他們選擇的顏色方案等。我很樂意將這些設置存儲爲純文本文件,並且安全性不是一個問題。在Python中存儲簡單的用戶設置

我目前看到它的方式是:有一個字典,其中所有的鍵都是用戶,值是用戶設置的字典。

例如,userdb [「bob」] [「colour_scheme」]的值爲「blue」。

將文件存儲在文件上的最佳方式是什麼?醃字典?

有沒有更好的方法來做我想做的事情?

回答

7

在詞典上使用cPickle將是我的選擇。字典對於這些類型的數據是非常合適的,所以根據您的要求,我沒有理由不使用它們。除非你正在考慮從非python應用程序讀取它們,在這種情況下,你必須使用語言中性文本格式。甚至在這裏,你可以擺脫泡菜加出口工具。

+1

在這種情況下,cPickle的問題是您無法爲一個用戶加載設置,您必須全部加載。貨架規模更好,使用起來也相當簡單。 – 2008-10-16 07:00:48

+1

如果你的字典包含你自己的對象(不只是內置的),那麼你可能會陷入困境。在將來的代碼修訂中,您可能會更改類名或將類移動到其他包中。然後舊數據將不會重組到新代碼中。 – ChrisCantrell 2014-05-30 19:22:41

0

如果你有一個數據庫,我可能會建議將設置存儲在數據庫中。但是,這聽起來像普通文件可能更適合您的環境。

您可能不想在同一個文件中存儲全部用戶設置,因爲您可能會遇到併發訪問該文件的麻煩。如果您將每個用戶的設置作爲字典存儲在自己的醃文件中,則他們將能夠獨立執行操作。

酸洗是一種合理的方式來存儲這樣的數據,但不幸的是,泡菜數據格式是臭名昭着的不可讀的。你最好將它存儲爲repr(dictionary)這將是一個更可讀的格式。要重新加載用戶設置,請使用eval(open("file").read())或類似的東西。

6

我沒有解決哪個問題最好的問題。如果你想處理文本文件,我會考慮ConfigParser -module。另一個你可以嘗試的將是simplejsonyaml。你也可以考慮一個真正的數據庫表。

例如,你可以有一個表叫userattrs,有三列:

  • 詮釋user_id說明
  • 字符串屬性名稱
  • 字符串ATTRIBUTE_VALUE

如果只有幾個,你可以將它們存儲到Cookie中以便快速檢索。

4

以下是最簡單的方法。使用簡單變量和import設置文件。

調用文件userprefs.py

# a user prefs file 
color = 0x010203 
font = "times new roman" 
position = (12, 13) 
size = (640, 480) 

在你的應用程序,你需要確保你可以導入此文件。你有很多的選擇。

  1. 使用PYTHONPATH。要求PYTHONPATH被設置爲包含具有首選項文件的目錄。

    a。明確的命令行參數來命名該文件(不是最好的,但簡單)

    灣一個命名文件的環境變量。

  2. 擴展sys.path包括用戶的主目錄

import sys 
import os 
sys.path.insert(0,os.path.expanduser("~")) 
import userprefs 
print userprefs.color 
1

如果configfiles的人類可讀性 - 重要的替代可能是the ConfigParser module它允許您讀取和寫入的.ini文件一樣。但是,然後你被限制在一個嵌套層次。

2

我會用shelve或者如果我將有一個sqlite數據庫存儲在文件系統上設置這些。雖然,因爲你正在建立一個網站,你可能會使用某種數據庫,那麼爲什麼不使用它呢?

0

的是,有你沒有使用這個數據庫特別的原因?這似乎是正常和自然的事情 - 或者將數據庫中的設置保存在用戶標識符或其他東西上的數據庫中。

您還沒有描述該網站的使用模式,而只是想着綜合性網站 - 但我認爲,保持設置在數據庫中會導致更小的磁盤I/O比使用文件。

OTOH,對於客戶端代碼可能使用的設置,將它們作爲JavaScript存儲在可緩存的靜態文件中將會很方便 - 但要犧牲多處可能的設置。 (我可能會將這些設置存儲在數據庫中,並根據需要重新生成靜態文件)

0

我同意使用Pickled Dictionary的回覆。在Dictionary結構中存儲簡單數據非常簡單有效。

0

如果你不在乎能夠自己編輯文件,並且想要一種快速的方式來保存python對象,請使用pickle。如果您確實希望文件可以被人讀取,或者可以被其他應用讀取,請使用ConfigParser。如果您有什麼需要更復雜的,去與某種數據庫中,無論是關係(sqlite),或面向對象(axiomzodb)。

3

對於數據庫驅動的網站,當然,最好的選擇是一個數據庫表。我假設你沒有做數據庫的事情。

如果你不關心人類可讀的格式,那麼pickle是一個簡單而直接的方法。我也聽說過關於simplejson的好消息。

如果可讀性是很重要的,兩個簡單的選擇出現了:

模塊:只需使用一個模塊。如果你只需要幾個全局變量而沒有任何幻想,那麼這就是要走的路。如果你真的絕望了,你可以定義類和類變量來模擬部分。缺點在於:如果文件將由用戶手動編輯,則錯誤可能難以捕捉和調試。

INI格式:我一直在使用ConfigObj爲此,相當成功。 ConfigObj本質上是ConfigParser的替代品,支持嵌套部分等等。或者,您可以爲文件定義預期的類型或值並進行驗證,爲用戶/管理員提供安全網(以及重要的錯誤反饋)。

9

我會使用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以瞭解基礎知識的優點。

1

內置的sqlite3模塊可能會比大多數替代品簡單得多,並且可以讓您準備好更新到完整的RDBMS,如果您想要或需要的話。