我正在编写一个网站,用户将在其中进行许多设置,例如他们选择的配色方案等。我很乐意将这些存储为纯文本文件,安全性不是问题。
我目前看到的方式是:有一个字典,其中所有键都是用户,值是字典,其中包含用户的设置。
例如,userdb["bob"]["colour_scheme"] 的值为 "blue"。
将其存储在文件中的最佳方式是什么?腌字典?
有没有更好的方法来做我想做的事情?
我会使用ConfigParser模块,它会为您的示例生成一些非常易读且用户可编辑的输出:
[鲍勃] colour_scheme:蓝色 英国人:是的 [乔] color_scheme:那是“颜色”,傻! 英国:没有
以下代码将生成上面的配置文件,然后将其打印出来:
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了解基础知识。
在字典上使用cPickle将是我的选择。字典自然适合此类数据,因此鉴于您的要求,我认为没有理由不使用它们。除非您考虑从非 python 应用程序中读取它们,否则您必须使用语言中性的文本格式。即使在这里,您也可以使用泡菜和导出工具。
我不解决哪个最好的问题。如果你想处理文本文件,我会考虑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
设置为包含首选项文件的目录。
一种。用于命名文件的显式命令行参数(不是最好的,但很简单)
湾。用于命名文件的环境变量。
扩展sys.path
以包含用户的主目录
例子
import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs
print userprefs.color
当然,对于数据库驱动的网站,最好的选择是 db 表。我假设你没有做数据库的事情。
如果您不关心人类可读的格式,那么pickle
这是一种简单直接的方法。我也听说过关于simplejson
.
如果人类可读性很重要,那么有两个简单的选择:
模块:只需使用一个模块。如果您只需要一些全局变量并且没有什么花哨的,那么这就是要走的路。如果你真的很绝望,你可以定义类和类变量来模拟部分。这里的缺点:如果文件将由用户手动编辑,错误可能难以捕捉和调试。
INI 格式:我一直在使用ConfigObj,并取得了相当大的成功。ConfigObj 本质上是 ConfigParser 的替代品,支持嵌套部分等等。或者,您可以定义文件的预期类型或值并对其进行验证,从而为用户/管理员提供安全网(和重要的错误反馈)。
如果我必须将这些设置存储在文件系统上,我会使用搁置或sqlite数据库。虽然,既然您正在构建一个网站,您可能会使用某种数据库,那么为什么不直接使用它呢?
内置的sqlite3模块可能比大多数替代品要简单得多,并且可以让您准备好在您想要或需要时更新到完整的 RDBMS。
如果配置文件的人类可读性很重要,一个替代方案可能是ConfigParser 模块,它允许您读取和写入类似 .ini 的文件。但是你被限制在一个嵌套级别。
如果您有数据库,我可能建议将设置存储在数据库中。但是,听起来普通文件可能更适合您的环境。
您可能不想将所有用户设置存储在同一个文件中,因为您可能会在并发访问该文件时遇到麻烦。如果您将每个用户的设置作为字典存储在他们自己的腌制文件中,那么他们将能够独立行动。
Pickling 是一种存储此类数据的合理方式,但不幸的是,众所周知,pickle 数据格式不适合人类阅读。您最好将其存储为repr(dictionary)
更具可读性的格式。要重新加载用户设置,请使用eval(open("file").read())
或类似的东西。
您没有为此使用数据库是否有特殊原因?这似乎是正常和自然的事情 - 或者将设置的pickle存储在用户ID或其他内容的数据库中。
您还没有描述网站的使用模式,而只是考虑了一个一般网站 - 但我认为将设置保存在数据库中会比使用文件导致更少的磁盘 I/O。
OTOH,对于客户端代码可能使用的设置,将它们作为 javascript 存储在可以缓存的静态文件中会很方便 - 以您可能有多个位置为代价。(我可能会将这些设置存储在数据库中,并根据需要重建静态文件)
我同意关于使用腌制字典的答复。在字典结构中存储简单数据非常简单有效。
如果您不关心自己能够编辑文件,并且想要一种快速保存 python 对象的方法,请使用pickle。如果您确实希望文件可以被人类读取,或者可以被其他应用程序读取,请使用ConfigParser。如果您需要更复杂的东西,请使用某种数据库,无论是关系型(sqlite)还是面向对象(axiom,zodb)。