Базовое хранение данных с Python - PullRequest
5 голосов
/ 18 июля 2010

Мне нужно хранить основные данные о клиентах и ​​автомобилях, которые они купили, и график оплаты этих автомобилей.Эти данные поступают из GUI, написанного на Python.У меня нет достаточного опыта для использования системы баз данных, такой как sql, поэтому я хочу хранить свои данные в файле в виде простого текста.И это не обязательно должно быть онлайн.

Чтобы иметь возможность искать и фильтровать их, сначала я преобразовываю свои данные (списки списков) в строку, а затем, когда мне нужно, данные повторно преобразовывают в обычный синтаксис списка Python.Я знаю, что это очень грубый способ, но безопасно ли так делать, или вы можете посоветовать мне другой путь?

Ответы [ 7 ]

8 голосов
/ 18 июля 2010

Никогда не безопасно сохранять вашу базу данных в текстовом формате (или используя pickle или что-то еще).Существует риск того, что проблемы при сохранении данных могут привести к повреждению.Не говоря уже о рисках, связанных с кражей ваших данных.

По мере роста вашего набора данных может произойти снижение производительности.

взгляните на sqlite (или sqlite3), который небольшой и которым легче управлять, чемMySQL.Если у вас нет очень маленького набора данных, который поместится в текстовом файле.

P / S: btw, использовать Berkeley DB в Python просто, и вам не нужно изучать все вещи БД, просто импортируйтеbsddb

5 голосов
/ 19 июля 2010

Я согласен с другими в том, что серьезные и важные данные будут более безопасными в некоторых типах легких баз данных, но также может испытывать сочувствие к стремлению сохранить простоту и прозрачность.

Итак, вместо того, чтобы придумывать собственный текстовый формат данных, я бы предложил вам использовать YAML

Формат удобочитаем, например:

List of things:
    - Alice
    - Bob
    - Evan

Вы загружаете файл так:

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

И список будет выглядеть так:

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

Конечно, вы можете сделать и обратное и сохранить данные в YAML, документы помогут вам в этом.

По крайней мере, другая альтернатива для рассмотрения :)

5 голосов
/ 18 июля 2010

Ответ на использование рассола хорош, но я лично предпочитаю полку.Он позволяет вам сохранять переменные в том же состоянии, в котором они находились между запусками, и я считаю, что им проще пользоваться, чем напрямую работать с маринадом.http://docs.python.org/library/shelve.html

3 голосов
/ 13 октября 2013

очень просто и просто - (подробнее @ 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()

с использованием:

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

    update_db({name:password})
2 голосов
/ 18 июля 2010

Вы можете использовать эту библиотеку для записи объекта в файл http://docs.python.org/library/pickle.html

1 голос
/ 18 июля 2010

Запись данных в файл не является безопасным способом хранения данных. Лучше использовать простую библиотеку базы данных, такую ​​как sqlalchemy . Это ORM для легкого использования базы данных ...

0 голосов
/ 18 июля 2010

Вы также можете хранить простые данные в текстовом файле. Однако тогда у вас мало поддержки для проверки согласованности данных, двойных значений и т. Д.

Вот мои простые данные типа «карточный файл» в текстовом файле фрагмент кода с использованием namedtuple, чтобы вы могли получить доступ к значениям не только по индексу в строке, но и по названию заголовка:

# 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: gishi@mymail.com
Address of record with key 123 by field number is: 456 happy st.
345: Dataline(id='345', name='tony', email='tony.veijalainen@somewhere.com', homeaddress='Espoo Finland')
123: Dataline(id='123', name='gishi', email='gishi@mymail.com', homeaddress='456 happy st.')
Ready
"""
...