Я должен хранить основные данные клиента и автомобили, которые они купили и график платежей этих автомобилей. Эти данные прибывают из GUI, записанного в Python. У меня нет достаточного опыта использовать систему баз данных как sql, таким образом, я хочу хранить свои данные в файле как простой текст. И это не должно быть онлайн.
Чтобы смочь искать и отфильтровать их, сначала я преобразовываю свои данные (списки списков) к строке затем, когда мне нужны данные, повторно преобразовывают в регулярный синтаксис списка Python. Я знаю, что это - путь очень "в лоб", но действительно ли безопасно сделать как этот, или можете Вы совет меня к иначе?
Никогда не безопасно сохранять вашу базу данных в текстовом формате (или используя pickle или что-то еще). Существует риск того, что проблемы при сохранении данных могут вызвать повреждение. Не говоря уже о рисках кражи ваших данных.
По мере роста набора данных может снизиться производительность.
обратите внимание на sqlite (или sqlite3), который меньше по размеру и проще в управлении, чем mysql. Если у вас нет очень маленького набора данных, который поместится в текстовый файл.
P / S: кстати, использовать berkeley db в python просто, и вам не нужно изучать все вещи DB, просто импортируйте bsddb
Ответ использовать рассол - это хорошо, но я лично предпочитаю полку. Это позволяет вам сохранять переменные в том же состоянии, в котором они находились между запусками, и я считаю, что его проще использовать, чем напрямую pickle. http://docs.python.org/library/shelve.html
Я согласен с другими, что серьезные и важные данные были бы более безопасными в некоторых типах легких баз данных, но также можно сочувствовать желанию сохранить простоту и прозрачность.
Итак, вместо того, чтобы изобретать свой собственный текстовый формат данных, я бы посоветовал вам использовать 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, документация поможет вам в этом.
По крайней мере, еще одна альтернатива для рассмотрения :)
Вы можете использовать эту библиотеку для записи объекта в файл http://docs.python.org/library/pickle.html
Запись данных в файл - небезопасный способ хранения данных. Лучше использовать простую библиотеку базы данных, например sqlalchemy . Это ORM для удобного использования базы данных ...
Вы также можете хранить простые данные в текстовом файле. Однако тогда у вас не будет большой поддержки для проверки согласованности данных, двойных значений и т. Д.
Вот мои простые данные типа «карточный файл» в текстовом файле фрагмент кода с использованием 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
"""