Pergunta

Eu estou programando um site no qual os usuários terão um número de configurações, tais como a sua escolha de esquema de cores, etc. estou feliz para armazenar estes como arquivos de texto simples, ea segurança não é um problema.

A maneira que eu atualmente vê-lo é:. Há um dicionário, em que todas as chaves são usuários e os valores são dicionários com as configurações dos usuários neles

Por exemplo, userdb [ "bob"] [ "colour_scheme"] teria o valor "azul".

O que é a melhor maneira de armazená-lo no arquivo? Decapagem dicionário?

Existem maneiras melhores de fazer o que estou tentando fazer?

Foi útil?

Solução

Usando cPickle no dicionário seria minha escolha. Os dicionários são um ajuste natural para este tipo de dados, portanto, dada suas necessidades vejo nenhuma razão para não usá-los. Que, a menos que você está pensando em lê-los a partir de aplicações não-python, caso em que você teria que usar um formato de texto neutro linguagem. E mesmo aqui você poderia fugir com o picles mais uma ferramenta de exportação.

Outras dicas

Gostaria de usar a ConfigParser módulo, que produz alguma saída muito legível e editável user-para o seu exemplo:

[bob]
colour_scheme: blue
british: yes
[joe]
color_scheme: that's 'color', silly!
british: no

O código a seguir iria produzir o arquivo de configuração acima, e, em seguida, imprimi-lo:

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

Note que ConfigParser suporta apenas cordas, assim você terá de converter como eu tenho acima para os Booleans. Consulte effbot para um run-down dos princípios básicos bom.

Eu não abordar a questão qual é o melhor. Se você deseja manipular arquivos-texto, eu consideraria ConfigParser - módulo . Outro que você poderia dar uma chance seria simplejson ou yaml . Você também pode considerar uma tabela db real.

Por exemplo, você poderia ter uma tabela chamada userattrs, com três colunas:

  • Int user_id
  • Cordas attribute_name
  • Cordas attribute_value

Se houver apenas alguns, você pode armazená-los em cookies para recuperação rápida.

Aqui é a maneira mais simples. Use variáveis ??simples e import o arquivo de configurações.

Chamar o userprefs.py arquivo

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

Em seu aplicativo, você precisa ter certeza de que você pode importar este arquivo. Você tem muitos opções.

  1. Usando PYTHONPATH. Exigir PYTHONPATH ser definido para incluir o diretório com os arquivos de preferências.

    a. Um parâmetro de linha de comando explícita para nomear o arquivo (não o melhor, mas simples)

    b. Uma variável de ambiente para nomear o arquivo.

  2. Estendendo sys.path para incluir o diretório home do usuário

Exemplo

import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs 
print userprefs.color

Para um site para banco de dados, é claro, a sua melhor opção é uma tabela db. Estou assumindo que você não está fazendo a coisa banco de dados.

Se você não se preocupam com formatos legíveis, então pickle é uma maneira simples e fácil de percorrer. Eu também ouvi bons relatórios sobre simplejson.

Se a legibilidade humana é importante, duas opções simples apresentam-se:

Módulo: Basta usar um módulo. Se tudo que você precisa são alguns globals e nada extravagante, então este é o caminho a percorrer. Se você realmente tem desesperada, você pode definir classes e variáveis ??de classe para seções imitar. A desvantagem aqui:. Se o arquivo será mão-editado por um usuário, erros podem ser difíceis de captura e depuração

formato INI: Eu tenho usado ConfigObj para isso, com um pouco de sucesso. ConfigObj é essencialmente um substituto para ConfigParser, com suporte para seções aninhados e muito mais. Opcionalmente, você pode definir tipos ou valores para um arquivo esperado e validá-lo, fornecendo uma rede de segurança (e importante o feedback de erro) para usuários / administradores.

Gostaria de usar prateleira ou um < a href = "http://www.python.org/doc/2.5.2/lib/module-sqlite3.html" rel = "nofollow noreferrer"> sqlite banco de dados se eu teria que armazenar essas configurações em o sistema de arquivos. Embora, desde que você está construindo um site que você provavelmente usar algum tipo de banco de dados para por que não usar isso?

A built-in sqlite3 módulo faria provavelmente ser muito mais simples do que a maioria das alternativas, e você fica pronto para atualizar para uma RDBMS completos que você deve sempre querem ou precisam.

Se readablity humana de configfiles importa Uma alternativa poderia ser o ConfigParser módulo , que lhe permite ler e escrever ini como arquivos. Mas, então, você está restrito a um nível de aninhamento.

Se você tem um banco de dados, eu poderia sugerir armazenar as configurações no banco de dados. No entanto, parece que os arquivos comuns pode se adequar ao seu ambiente melhor.

Você provavelmente não deseja armazenar todas as configurações de usuários no mesmo arquivo, porque você pode ter problemas com o acesso simultâneo a esse arquivo um. Se você armazenou as configurações de cada usuário como um dicionário em seu próprio arquivo de conserva, em seguida, eles seriam capazes de agir de forma independente.

Decapagem é uma forma razoável para armazenar esses dados, mas infelizmente o formato de dados de picles é notoriamente-não-humano legível. Você pode ser melhor fora de armazená-lo como repr(dictionary) que será um formato mais legível. Para recarregar a configurações do usuário, eval(open("file").read()) uso ou algo parecido.

Existe são razão especial que você não está usando o banco de dados para isso? parece que a coisa normal e natural a fazer -. ou armazenar um pickle das configurações no db introduzidos na identificação de usuário ou algo

Você não descreveu os padrões de uso do site, mas apenas pensar de um site geral - mas eu acho que manter as configurações em um banco de dados poderia causar muito menos disco I / O do que o uso de arquivos

.

OTOH, para as configurações que podem ser usados ??pelo código do lado do cliente, armazenando-os como javascript em um arquivo estático que pode ser armazenada em cache seria útil - à custa de ter vários lugares que você pode ter configurações. (Eu provavelmente armazenar essas configurações no db, e reconstruir os arquivos estáticos se necessário)

Eu concordo com a resposta sobre o uso de conserva dicionário. Muito simples e eficaz para o armazenamento de dados simples em uma estrutura de Dictionary.

Se você não se preocupam com a possibilidade de editar o arquivo, e quer uma maneira rápida para persistir objetos python, ir com picles . Se você deseja que o arquivo para ser lido por um humano, ou legível por algum outro aplicativo, uso ConfigParser . Se precisar de algo mais complexo, vai com algum tipo de banco de dados, seja relacional ( sqlite ), ou orientada a objetos ( axioma , zodb ).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top