Хранить простые пользовательские настройки в Python
я программирую веб-сайт, в котором пользователи будут иметь ряд настроек, таких как выбор цветовой гаммы, и т. д. Я рад хранить их как текстовые файлы, и безопасность не является проблемой.
то, как я это вижу в настоящее время: есть словарь, где все ключи являются пользователями, а значения-словари с настройками пользователей в них.
например, userdb ["bob"] ["colour_scheme"] будет иметь значение"синий".
Что самое лучшее способ сохранить его в файл? Мариновать словарь?
есть ли лучшие способы сделать то, что я пытаюсь сделать?
12 ответов
используя 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-module. Еще можно дать попробовать бы simplejson или в YAML. Вы также можете рассмотреть реальную таблицу db.
например, у вас может быть таблица userattrs с тремя столбцами:
- Int user_id
- строка имя_атрибута
- строка attribute_value
Если их всего несколько, вы можете сохранить их в куки для быстрого поиска.
вот самый простой способ. Используйте простые переменные и параметры.
вызов файла userprefs.py
# a user prefs file
color = 0x010203
font = "times new roman"
position = ( 12, 13 )
size = ( 640, 480 )
в вашем приложении, вы должны быть уверены, что вы можете импортировать этот файл. У вас есть много выбор.
-
используя
PYTHONPATH. RequirePYTHONPATHустановите, чтобы включить каталог с файлами настроек.а. Явный параметр командной строки для имени файла (не лучший, но простой)
b. Переменная среды для имени файла.
расширения
sys.pathвключить домашний каталог пользователя
пример
import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs
print userprefs.color
для веб-сайта, управляемого базой данных, конечно, лучшим вариантом является таблица БД. Я предполагаю, что вы не занимаетесь базой данных.
Если вы не заботитесь о удобочитаемых форматах, то pickle Это простой и простой способ пойти. Я также слышал хорошие отчеты о simplejson.
если человеческая читаемость важна, то 2 простых варианта представляют:
модуль: просто используйте модуль. Если все, что вам нужно, это несколько глобалов и ничего особенного, тогда это путь. Если вы действительно отчаялись, вы можете определить классы и переменные класса для эмуляции разделов. Недостатком здесь: Если файл будет вручную пользователем, ошибки могут быть трудно поймать и отладить.
формат INI: я использую статические библиотеки для этого, с небольшим успехом. ConfigObj по существу является заменой ConfigParser, с поддержкой вложенных разделов и многое другое. По желанию, вы можете определите ожидаемые типы или значения для файла и проверьте его, предоставив сетку безопасности (и важную обратную связь об ошибках) для пользователей/администраторов.
Если человека readablity из configfiles вопросам альтернативой может быть модуль ConfigParser что позволяет читать и писать .Ини файлы. Но тогда вы ограничены одним уровнем вложенности.
встроенный и sqlite3 модуль, вероятно, будет намного проще, чем большинство альтернатив, и вы будете готовы обновить до полной РСУБД, если вы когда-нибудь захотите или захотите.
Если у вас есть база данных, я мог бы предложить хранить настройки в базе данных. Тем не менее, похоже, что обычные файлы могут лучше соответствовать вашей среде.
вы, вероятно, не хотите хранить все настройки пользователей в том же файле, потому что вы можете столкнуться с проблемами с параллельным доступом к этому файлу. Если вы сохраните настройки каждого пользователя в виде словаря в их собственном маринованном файле, они смогут действовать независимо.
маринование разумный способ хранения таких данных, но, к сожалению, формат данных рассола, как известно, не читается человеком. Возможно, вам лучше хранить его как repr(dictionary) который будет более читаемым форматом. Чтобы перезагрузить настройки пользователя, используйте eval(open("file").read()) или что-то подобное.
есть ли особая причина, по которой вы не используете базу данных для этого? это кажется нормальной и естественной вещью - или хранить рассол настроек в БД, набранных на id пользователя или что-то еще.
вы не описали шаблоны использования веб - сайта, но просто подумали об общем веб-сайте, но я бы подумал, что сохранение настроек в базе данных вызовет гораздо меньше ввода-вывода диска, чем использование файлов.
OTOH, для настроек, которые могут использоваться на стороне клиента код, хранящий их как javascript в статическом файле, который можно кэшировать, будет удобен-за счет наличия нескольких мест, где у вас могут быть настройки. (Я, вероятно, сохраню эти настройки в БД и перестрою статические файлы по мере необходимости)
Я согласен с ответом об использовании маринованного словаря. Очень простой и эффективный для хранения простых данных в структуре словаря.
Если вы не заботитесь о возможности редактировать файл самостоятельно и хотите быстрый способ сохранения объектов python, перейдите к огурец. Если вы хотите, чтобы файл читался человеком или каким-либо другим приложением, используйте ConfigParser. Если вам нужно что-то более сложное, перейдите к какой-то базе данных, будь то реляционная (SQLite в) или объектно-ориентированного (аксиомы, зодб).