ZODBのような Python オブジェクト データベースを絶対にお勧めします。オブジェクト(文字通り好きなもの)を辞書に保存することを考えると、これはあなたの状況に非常に適しているようです。これは、辞書を辞書内に保存できることを意味します。私はこれをさまざまな問題で使用してきましたが、データベース ファイル (拡張子が .fs のファイル) を誰かに渡すだけでよいという利点があります。これにより、ユーザーはそれを読み込んで、必要なクエリを実行し、自分のローカル コピーを変更できるようになります。複数のプログラムが同じデータベースに同時にアクセスしたい場合は、必ずZEOを確認してください。
始める方法のばかげた例:
from ZODB import DB
from ZODB.FileStorage import FileStorage
from ZODB.PersistentMapping import PersistentMapping
import transaction
from persistent import Persistent
from persistent.dict import PersistentDict
from persistent.list import PersistentList
# Defining database type and creating connection.
storage = FileStorage('/path/to/database/zodbname.fs')
db = DB(storage)
connection = db.open()
root = connection.root()
# Define and populate the structure.
root['Vehicle'] = PersistentDict() # Upper-most dictionary
root['Vehicle']['Tesla Model S'] = PersistentDict() # Object 1 - also a dictionary
root['Vehicle']['Tesla Model S']['range'] = "208 miles"
root['Vehicle']['Tesla Model S']['acceleration'] = 5.9
root['Vehicle']['Tesla Model S']['base_price'] = "$71,070"
root['Vehicle']['Tesla Model S']['battery_options'] = ["60kWh","85kWh","85kWh Performance"]
# more attributes here
root['Vehicle']['Mercedes-Benz SLS AMG E-Cell'] = PersistentDict() # Object 2 - also a dictionary
# more attributes here
# add as many objects with as many characteristics as you like.
# commiting changes; up until this point things can be rolled back
transaction.get().commit()
transaction.get().abort()
connection.close()
db.close()
storage.close()
データベースが作成されると、非常に簡単に使用できます。これはオブジェクト データベース (辞書) であるため、オブジェクトに非常に簡単にアクセスできます。
#after it's opened (lines from the very beginning, up to and including root = connection.root() )
>> root['Vehicles']['Tesla Model S']['range']
'208 miles'
また、すべてのキーを表示することもできます (そして、他のすべての標準的な辞書操作を行うこともできます)。
>> root['Vehicles']['Tesla Model S'].keys()
['acceleration', 'range', 'battery_options', 'base_price']
最後に言及したいのは、キーを変更できるということです: python 辞書のキー値を変更します。値も変更できます。そのため、方法や何かを変更したために調査結果が変わった場合でも、データベース全体をゼロから開始する必要はありません (特に他のすべてがまだ問題ない場合)。これらの両方を行う場合は注意してください。キーまたは値を上書きしようとする試みを確実に認識できるように、データベース コードに安全対策を講じています。
** 追加した **
# added imports
import numpy as np
from tempfile import TemporaryFile
outfile = TemporaryFile()
# insert into definition/population section
np.save(outfile,np.linspace(-1,1,10000))
root['Vehicle']['Tesla Model S']['arraydata'] = outfile
# check to see if it worked
>>> root['Vehicle']['Tesla Model S']['arraydata']
<open file '<fdopen>', mode 'w+b' at 0x2693db0>
outfile.seek(0)# simulate closing and re-opening
A = np.load(root['Vehicle']['Tesla Model S']['arraydata'])
>>> print A
array([-1. , -0.99979998, -0.99959996, ..., 0.99959996,
0.99979998, 1. ])
これとまったく同じ方法で、複数の numpy 配列の圧縮保存に numpy.savez() を使用することもできます。