4

顧客と顧客が購入した車の基本データと、これらの車の支払いスケジュールを保存する必要があります。これらのデータは、Python で記述された GUI から取得されます。SQL のようなデータベース システムを使用するのに十分な経験がないため、データをプレーン テキストとしてファイルに保存したいと考えています。そして、それはオンラインである必要はありません。

それらを検索およびフィルタリングできるようにするには、まずデータ (リストのリスト) を文字列に変換し、次にデータが必要になったら、通常の Python リスト構文に再変換します。それが非常に強引な方法であることはわかっていますが、そのようにしても安全ですか、それとも別の方法をアドバイスしてもらえますか?

4

7 に答える 7

7

データベースをテキスト形式で(またはpickleなどを使用して)保存することは決して安全ではありません。データの保存中に問題が発生すると、破損する可能性があります。データが盗まれるリスクは言うまでもありません。

データセットが大きくなると、パフォーマンスが低下する可能性があります。

mysqlよりも小さくて管理しやすいsqlite(またはsqlite3)を見てください。テキストファイルに収まる非常に小さなデータセットがない限り。

P / S:ところで、Pythonでberkeley dbを使用するのは簡単で、すべてのDBのことを学ぶ必要はなく、bsddbをインポートするだけです。

于 2010-07-18T16:39:00.440 に答える
5

漬物を使うという答えは良いですが、私は個人的に棚を好みます。これにより、変数を起動間と同じ状態に保つことができ、直接ピクルスするよりも使いやすいと思います。 http://docs.python.org/library/shelve.html

于 2010-07-18T16:44:29.150 に答える
5

私は他の人たちに同意します。深刻で重要なデータは、ある種のライトデータベースではより安全ですが、物事をシンプルで透明に保ちたいという願望にも共感を覚えることができます。

したがって、独自のテキストベースのデータ形式を発明する代わりに、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に保存することもできますが、ドキュメントがそのお手伝いをします。

考慮すべき少なくとも別の選択肢:)

于 2010-07-19T07:57:12.993 に答える
3

非常にシンプルで基本的な - (more @ 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})
于 2013-10-13T16:07:08.553 に答える
2

このライブラリを使用して、オブジェクトをファイルhttp://docs.python.org/library/pickle.htmlに書き込むことができます

于 2010-07-18T16:11:05.280 に答える
1

ファイルへのデータの書き込みは、データ ストレージの安全な方法ではありません。sqlalchemyのような単純なデータベース ライブラリを使用することをお勧めします。これは、データベースを簡単に使用するための ORM です...

于 2010-07-18T16:50:08.157 に答える
0

単純なデータをプレーン テキスト ファイルに保存することもできます。ただし、データの一貫性、二重値などをチェックするためのサポートはあまりありません。

これは、行内のインデックスだけでなくヘッダー名によっても値にアクセスできるように、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
"""
于 2010-07-18T18:59:21.837 に答える