2010-07-18 4 views
4

Je dois stocker les données de base des clients et des voitures qu'ils ont achetées et le calendrier de paiement de ces voitures. Ces données proviennent de l'interface graphique, écrite en Python. Je n'ai pas assez d'expérience pour utiliser un système de base de données comme SQL, donc je veux stocker mes données dans un fichier en texte brut. Et il ne doit pas nécessairement être en ligne. Pour pouvoir les rechercher et les filtrer, d'abord je convertis mes données (listes de listes) à la chaîne puis quand j'ai besoin des données de reconvertir à la syntaxe de liste de Python régulière. Je sais que c'est un moyen très brutal, mais est-ce que c'est sûr de faire comme ça ou pouvez-vous me conseiller d'une autre façon?Stockage de données de base avec Python

Répondre

6

Il est sûr de ne jamais enregistrer votre base de données dans un format texte (ou en utilisant cornichon ou autre). Il existe un risque que des problèmes lors de l'enregistrement des données puissent entraîner une corruption. Sans parler des risques liés au vol de vos données. Au fur et à mesure de la croissance de votre jeu de données, les performances risquent d'être affectées.

jetez un oeil à sqlite (ou sqlite3) qui est petit et plus facile à gérer que mysql. Sauf si vous avez un très petit jeu de données qui tiendra dans un fichier texte.

P/S: BTW, en utilisant db en python berkeley est simple, et vous n'avez pas à apprendre toutes les choses DB, il suffit d'importer bsddb

+0

module 'bsddb' a été retiré de Python 3 bibliothèque. (il peut encore être disponible en tant que tiers) –

5

La réponse à utiliser cornichon est bon, mais je préfère personnellement étagère. Il vous permet de garder les variables dans le même état où elles se trouvaient entre les lancements et je trouve que c'est plus facile à utiliser que le pickle directement. http://docs.python.org/library/shelve.html

1

L'écriture de données dans un fichier n'est pas un moyen sûr pour le stockage de données. Mieux vaut utiliser une bibliothèque de base de données simple comme sqlalchemy. C'est un ORM pour une utilisation facile de la base de données ...

0

Vous pouvez également conserver des données simples dans un fichier texte. Ensuite, vous n'avez pas beaucoup de support pour vérifier la cohérence des données, des doubles valeurs etc.

Voici mes simples données de type 'fichier carte' dans le fichier texte code snippet en utilisant namedtuple pour que vous puissiez accéder aux valeurs non seulement par index dans ligne mais ils header nom:

# text based data input with data accessible 
# with named fields or indexing 
from __future__ import print_function ## Python 3 style printing 
from collections import namedtuple 
import string 

filein = open("sample.dat") 

datadict = {} 

headerline = filein.readline().lower() ## lowercase field names Python style 
## first non-letter and non-number is taken to be the separator 
separator = headerline.strip(string.lowercase + string.digits)[0] 
print("Separator is '%s'" % separator) 

headerline = [field.strip() for field in headerline.split(separator)] 
Dataline = namedtuple('Dataline',headerline) 
print ('Fields are:',Dataline._fields,'\n') 

for data in filein: 
    data = [f.strip() for f in data.split(separator)] 
    d = Dataline(*data) 
    datadict[d.id] = d ## do hash of id values for fast lookup (key field) 

## examples based on sample.dat file example 
key = '123' 
print('Email of record with key %s by field name is: %s' % 
     (key, datadict[key].email)) 

## by number 
print('Address of record with key %s by field number is: %s' % 
     (key ,datadict[key][3])) 

## print the dictionary in separate lines for clarity 
for key,value in datadict.items(): 
    print('%s: %s' % (key, value)) 

input('Ready') ## let the output be seen when run directly 

""" Output: 
Separator is ';' 
Fields are: ('id', 'name', 'email', 'homeaddress') 

Email of record with key 123 by field name is: [email protected] 
Address of record with key 123 by field number is: 456 happy st. 
345: Dataline(id='345', name='tony', email='[email protected]', homeaddress='Espoo Finland') 
123: Dataline(id='123', name='gishi', email='[email protected]', homeaddress='456 happy st.') 
Ready 
""" 
4

Je suis d'accord avec les autres que les données sérieuses et importantes seraient plus en sécurité dans un certain type de base de données, mais la lumière peut aussi ressentir de la sympathie pour le désir de garder les choses simples et transparentes.

Ainsi, au lieu d'inventer vos propres données format texte, je vous suggère d'utiliser YAML

Le format est lisible par l'homme, par exemple:

List of things: 
    - Alice 
    - Bob 
    - Evan 

Vous chargez le fichier comme ceci:

>>> import yaml 
>>> file = open('test.yaml', 'r') 
>>> list = yaml.load(file) 

Et la liste ressemblera à ceci:

{'List of things': ['Alice', 'Bob', 'Evan']} 

Bien sûr, vous pouvez aussi faire l'inverse et enregistrer des données dans YAML, les docs vous aideront avec cela.

Au moins une autre alternative à considérer :)

3

très simple et basique - (plus @http://pastebin.com/A12w9SVd)

import json, os 

db_name = 'udb.db' 

def check_db(name = db_name): 
    if not os.path.isfile(name): 
     print 'no db\ncreating..' 
     udb = open(db_name,'w') 
     udb.close() 

def read_db(): 
    try: 
     udb = open(db_name, "r") 
    except: 
     check_db() 
     read_db() 
    try: 
     dicT = json.load(udb) 
     udb.close() 
     return dicT 
    except: 
     return {}  

def update_db(newdata): 
    data = read_db() 
    wdb = dict(data.items() + newdata.items())  
    udb = open(db_name, 'w') 
    json.dump(wdb, udb) 
    udb.close() 

utilisant:

def adduser(): 
    print 'add user:' 
    name = raw_input('name > ') 
    password = raw_input('password > ') 

    update_db({name:password}) 
Questions connexes