Pergunta

Este é o que eu fiz para um projeto. Eu tenho algumas estruturas de dados que são bascially dicionários com alguns métodos que operam sobre os dados. Quando eu guardá-las para o disco, eu escrevê-los em arquivos .py como o código que, quando importados como um módulo irá carregar os mesmos dados em tal estrutura de dados.

Esta é razoável? Há algum grandes desvantagens? A vantagem que eu vejo é que quando eu quiser operar com os dados salvos, posso importar rapidamente os módulos que eu preciso. Além disso, os módulos podem ser usados ??separado do resto da aplicação, porque você não precisa de uma funcionalidade analisador ou carregador separado.

Foi útil?

Solução

É razoável, e eu faço isso o tempo todo. Obviamente não é um formato que você usa para a troca de dados, por isso não é um bom formato para qualquer coisa como uma gravação de arquivo.

Mas, por exemplo, quando eu faço migrações de sites para Plone, eu muitas vezes obter dados sobre o site (como uma lista de quais páginas devem ser migrados, ou uma lista de como urls de idade devem ser mapeados para os novos, aor listas de tags). Estes você normalmente obter em formato Excel Palavra och. Também os dados muitas vezes precisa massagear um pouco, e eu acabar com o que para todos os efeitos estão dicionários mapeamento um URL para algumas outras informações.

Claro, eu poderia save que, como CVS, e analisá-lo em um dicionário. Mas em vez disso eu normalmente salvá-lo como um arquivo de Python com um dicionário. Salva código.

Então, sim, é razoável, não, não é um formato que você deve usar para qualquer tipo de salvar o arquivo. É no entanto muitas vezes usado para dados que fica na fronteira com a configuração, como acima.

Outras dicas

Ao operar desta forma, você pode ganhar alguma pitada de conveniência, mas você paga muitos tipos de preço por isso. O espaço que leva para salvar seus dados, e o tempo que leva para salvar e recarregá-lo, suba substancialmente; e sua exposição de segurança é ilimitado - você deve ferozmente proteger os caminhos a partir do qual você recarregar módulos, como seria fornecer uma avenida fácil para qualquer atacante código de injetar de sua escolha para ser executado sob o seu ID de usuário (em si pickle não é sólida , em termos de segurança, mas, em comparação com este arranjo, brilha; -).

Ao todo, eu prefiro um arranjo mais simples e tradicional: vidas código executável em um módulo (em um caminho típico código de carregamento, que não precisa ser R / W uma vez que o módulo compilado) - ele é carregado apenas uma vez e de uma forma já compilado. Dados viver em seus próprios arquivos (ou partes de DB, etc) em qualquer um dos muitos formatos adequados, principalmente aqueles padrão (possivelmente incluindo os multi-idioma, como JSON, CSV, XML, ... & c, se eu quiser manter a opção aberta para carregar facilmente os dados de outros idiomas no futuro).

A maior desvantagem é que é um problema de segurança em potencial, já que é difícil de garantia de que os arquivos não contém um código arbitrário, o que poderia ser muito ruim. Portanto, não use esta abordagem se alguém mais do que você tem acesso de gravação aos arquivos.

A opção razoável seria usar a Pickle módulo, que é projetado especificamente para salvar e restaurar estruturas python para o disco.

A resposta de Alex Martelli é absolutamente perspicaz e eu concordo com ele. No entanto, eu vou dar um passo adiante e fazer uma recomendação específica:. Uso JSON

JSON é simples, e estruturas de dados do Python mapear bem para ele; e há várias bibliotecas padrão e ferramentas para trabalhar com JSON. O módulo json em Python 3,0 e mais recente é baseado no simplejson , por isso seria usar em simplejson Python 2.x e json em Python 3.0 e mais recentes.

Uma segunda opção é XML. XML é mais complicado e mais difícil de olhar apenas em (ou apenas editar com um editor de texto), mas há uma grande variedade de ferramentas para validá-lo, filtrá-la, editá-lo, etc.

Além disso, se o seu armazenamento de dados e necessidades de recuperação de tornar-se em tudo não trivial, considere o uso de um banco de dados real. SQLite é fantástico: é pequeno, e para bases de dados pequenas corre muito rápido, mas é um verdadeiro banco de dados SQL real. Eu definitivamente utilizar um Python ORM em vez de aprender SQL para interagir com o banco de dados; meu ORM favorito para SQLite seria Outono (pequeno e simples), ou o ORM de Django (você não precisa mesmo de aprender como criar tabelas no SQL!) Então, se você nunca outgrow SQLite, você pode mover -se a um banco de dados real, como PostgreSQL . Se você está escrevendo um monte de loops que busca através de seus dados salvos, e especialmente se você precisar de fazer cumprir as dependências (como se foo é excluído, bar deve ser excluído também) considerar ir a um banco de dados.

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