我编程的一个网站的用户在其中将有一定数量的设置,诸如他们的选择色彩方案,等等。我很高兴储存这些作为纯文本文件和安全不是一个问题。

我目前看到的是:有一个词典,在那里所有的钥匙都用户和价值观是字典的用户设置在其中。

例如,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 )

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

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

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

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

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

  3. 实施例

    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 )。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top