题
我编程的一个网站的用户在其中将有一定数量的设置,诸如他们的选择色彩方案,等等。我很高兴储存这些作为纯文本文件和安全不是一个问题。
我目前看到的是:有一个词典,在那里所有的钥匙都用户和价值观是字典的用户设置在其中。
例如,userdb["鲍勃"]["colour_scheme"]将具有的价值"蓝色"。
什么是最好的方式存在文件?洗字典?
是否有更好的方式做我想做什么?
解决方案
在字典上使用 cPickle 将是我的选择。字典很适合这类数据,因此根据您的要求,我认为没有理由不使用它们。除非您考虑从非python应用程序中读取它们,否则您必须使用语言中性文本格式。即使在这里,你也可以使用泡菜和出口工具。
其他提示
我会使用 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 。
我不处理这个问题是哪一个是最好的。如果你要处理文本的文件,我会考虑 ConfigParser模块.另一个你可以给一个尝试会 simplejson 或 其.你也可以考虑一个真正的db表。
例如,你可以有一个表叫userattrs,三列:
- Int user_id
- 串attribute_name
- 串attribute_value
如果只有几个,你可以保存它们的成饼干用于快速检索。
这是最简单的方法。使用简单变量和 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
对于数据库驱动的网站,当然,您最好的选择是数据库表。我假设你没有做数据库的事情。
如果您不关心人类可读的格式,那么 pickle
是一种简单明了的方法。我也听说过关于 simplejson
的好报道。
如果人类的可读性很重要,那么就有两个简单的选择:
模块:只需使用模块即可。如果您需要的只是一些全局变量并且没有任何花哨,那么这就是要走的路。如果你真的很绝望,你可以定义类和类变量来模拟部分。这里的缺点是:如果文件将由用户手工编辑,则错误可能难以捕获和调试。
INI格式:我一直在使用 ConfigObj 为此,取得了相当大的成功。 ConfigObj本质上是ConfigParser的替代品,支持嵌套部分等等。 (可选)您可以定义文件的预期类型或值并对其进行验证,为用户/管理员提供安全网(以及重要的错误反馈)。
我会使用搁置或< a href =“http://www.python.org/doc/2.5.2/lib/module-sqlite3.html"rel =”nofollow noreferrer“> sqlite 数据库,如果我必须存储这些设置文件系统。虽然,既然你正在建立一个网站,你可能会使用某种数据库,那么为什么不使用它呢?
内置 sqlite3 模块可能比大多数替代方案简单得多,并且如果您想要或需要,可以让您准备好更新到完整的RDBMS。
如果配置文件的人员可读性很重要,则替代方案可能是 ConfigParser模块允许您像文件一样读写.ini。但是你被限制在一个嵌套级别。
如果您有数据库,我可能会建议将设置存储在数据库中。但是,听起来普通文件可能更适合您的环境。
您可能不希望将所有用户设置存储在同一文件中,因为您可能会遇到对该文件的并发访问的问题。如果您将每个用户的设置存储为他们自己的pickle文件中的字典,那么他们就可以独立行动。
酸洗是存储此类数据的合理方式,但不幸的是,pickle数据格式众所周知不是人类可读的。您可能最好将其存储为 repr(dictionary)
,这将是一种更易读的格式。要重新加载用户设置,请使用 eval(打开(“文件”).read())
或类似的东西。
您是否有特殊原因没有使用数据库?这似乎是正常和自然的事情 - 或者在用户ID或其他东西的数据库中存储设置的pickle。
您还没有描述网站的使用模式,只是考虑一般网站 - 但我认为保留数据库中的设置会导致比使用文件少得多的磁盘I / O.
OTOH,对于可能由客户端代码使用的设置,将它们作为javascript存储在可以缓存的静态文件中会很方便 - 以牺牲多个地方为例可能有设置。 (我可能会在db中存储这些设置,并根据需要重建静态文件)
我同意有关使用Pickled Dictionary的回复。在Dictionary结构中存储简单数据非常简单有效。
如果您不关心能够自己编辑文件,并希望快速保存python对象,请使用泡菜。如果您确实希望文件可由人阅读,或者其他应用可读,请使用 ConfigParser 。如果您需要更复杂的东西,请使用某种数据库,无论是关系型的( sqlite ),或面向对象的(公理, zodb )。