8

我正在编写一个网站,用户将在其中进行许多设置,例如他们选择的配色方案等。我很乐意将这些存储为纯文本文件,安全性不是问题。

我目前看到的方式是:有一个字典,其中所有键都是用户,值是字典,其中包含用户的设置。

例如,userdb["bob"]["colour_scheme"] 的值为 "blue"。

将其存储在文件中的最佳方式是什么?腌字典?

有没有更好的方法来做我想做的事情?

4

12 回答 12

9

我会使用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了解基础知识。

于 2008-10-14T21:50:29.490 回答
7

在字典上使用cPickle将是我的选择。字典自然适合此类数据,因此鉴于您的要求,我认为没有理由不使用它们。除非您考虑从非 python 应用程序中读取它们,否则您必须使用语言中性的文本格式。即使在这里,您也可以使用泡菜和导出工具。

于 2008-10-14T10:10:11.900 回答
6

我不解决哪个最好的问题。如果你想处理文本文件,我会考虑ConfigParser -module。您可以尝试的另一个是simplejsonyaml。你也可以考虑一个真正的数据库表。

例如,您可以有一个名为 userattrs 的表,其中包含三列:

  • 诠释 user_id
  • 字符串属性名
  • 字符串属性值

如果只有少数,您可以将它们存储到 cookie 中以便快速检索。

于 2008-10-14T10:15:35.400 回答
5

这是最简单的方法。使用简单的变量和import设置文件。

调用文件 userprefs.py

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

在您的应用程序中,您需要确保可以导入此文件。你有很多选择。

  1. 使用PYTHONPATH. 需要PYTHONPATH设置为包含首选项文件的目录。

    一种。用于命名文件的显式命令行参数(不是最好的,但很简单)

    湾。用于命名文件的环境变量。

  2. 扩展sys.path以包含用户的主目录

例子

import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs 
print userprefs.color
于 2008-10-14T10:15:49.517 回答
3

当然,对于数据库驱动的网站,最好的选择是 db 表。我假设你没有做数据库的事情。

如果您不关心人类可读的格式,那么pickle这是一种简单直接的方法。我也听说过关于simplejson.

如果人类可读性很重要,那么有两个简单的选择:

模块:只需使用一个模块。如果您只需要一些全局变量并且没有什么花哨的,那么这就是要走的路。如果你真的很绝望,你可以定义类和类变量来模拟部分。这里的缺点:如果文件将由用户手动编辑,错误可能难以捕捉和调试。

INI 格式:我一直在使用ConfigObj,并取得了相当大的成功。ConfigObj 本质上是 ConfigParser 的替代品,支持嵌套部分等等。或者,您可以定义文件的预期类型或值并对其进行验证,从而为用户/管理员提供安全网(和重要的错误反馈)。

于 2008-10-14T14:08:57.097 回答
2

如果我必须将这些设置存储在文件系统上,我会使用搁置sqlite数据库。虽然,既然您正在构建一个网站,您可能会使用某种数据库,那么为什么不直接使用它呢?

于 2008-10-14T12:32:07.027 回答
2

内置的sqlite3模块可能比大多数替代品要简单得多,并且可以让您准备好在您想要或需要时更新到完整的 RDBMS。

于 2008-10-14T21:58:00.693 回答
1

如果配置文件的人类可读性很重要,一个替代方案可能是ConfigParser 模块,它允许您读取和写入类似 .ini 的文件。但是你被限制在一个嵌套级别。

于 2008-10-14T10:19:53.987 回答
0

如果您有数据库,我可能建议将设置存储在数据库中。但是,听起来普通文件可能更适合您的环境。

您可能不想将所有用户设置存储在同一个文件中,因为您可能会在并发访问该文件时遇到麻烦。如果您将每个用户的设置作为字典存储在他们自己的腌制文件中,那么他们将能够独立行动。

Pickling 是一种存储此类数据的合理方式,但不幸的是,众所周知,pickle 数据格式不适合人类阅读。您最好将其存储为repr(dictionary)更具可读性的格式。要重新加载用户设置,请使用eval(open("file").read())或类似的东西。

于 2008-10-14T10:13:48.197 回答
0

您没有为此使用数据库是否有特殊原因?这似乎是正常和自然的事情 - 或者将设置的pickle存储在用户ID或其他内容的数据库中。

您还没有描述网站的使用模式,而只是考虑了一个一般网站 - 但我认为将设置保存在数据库中会比使用文件导致更少的磁盘 I/O。

OTOH,对于客户端代码可能使用的设置,将它们作为 javascript 存储在可以缓存的静态文件中会很方便 - 以您可能有多个位置为代价。(我可能会将这些设置存储在数据库中,并根据需要重建静态文件)

于 2008-10-14T12:50:27.240 回答
0

我同意关于使用腌制字典的答复。在字典结构中存储简单数据非常简单有效。

于 2008-10-14T14:01:44.727 回答
0

如果您不关心自己能够编辑文件,并且想要一种快速保存 python 对象的方法,请使用pickle。如果您确实希望文件可以被人类读取,或者可以被其他应用程序读取,请使用ConfigParser。如果您需要更复杂的东西,请使用某种数据库,无论是关系型(sqlite)还是面向对象(axiomzodb)。

于 2008-10-14T14:02:28.000 回答