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