読者のこの記事では、Pythonで効果的にデータを保存する方法を扱います。
How to save data in Python?
Pythonではすべてがオブジェクトなので、Pythonアプリケーションで作業するときは、Pythonオブジェクトを直接扱うことになります。
Pythonではすべてがオブジェクトなので、それらを簡単に保存する方法をいくつか見てみましょう。
1. Pythonオブジェクトを保存するためにPickleを使用する
シンプルにしたい場合は、Pythonのデータを保存するための標準ライブラリの一部であるpickleモジュールを使用することができます。
Pythonオブジェクトをpickleファイルに “pickle “して、データの保存/読み込みに利用することができます。
Pythonのオブジェクトをpickleファイルに保存し、それを使ってデータを保存したり読み込んだりすることができます。
import pickle
class MyClass():
def __init__( self , param):
self .param = param
def save_object(obj):
try :
with open ( "data.pickle" , "wb" ) as f:
pickle.dump(obj, f, protocol = pickle.HIGHEST_PROTOCOL)
except Exception as ex:
print ( "Error during pickling object (Possibly unsupported):" , ex)
obj = MyClass( 10 )
save_object(obj) |
このスクリプトを実行すると、data.pickle
というファイルに保存されたデータが表示されるはずです。
同じオブジェクトを再びロードするには、同様のロジックで pickle.load()
を使用します。
import pickle
class MyClass():
def __init__( self , param):
self .param = param
def load_object(filename):
try :
with open (filename, "rb" ) as f:
return pickle.load(f)
except Exception as ex:
print ( "Error during unpickling object (Possibly unsupported):" , ex)
obj = load_object( "data.pickle" )
print (obj.param)
print ( isinstance (obj, MyClass))
|
結果は以下の通りです。
10 True |
古いデータの取得に成功しました!
2. Sqlite3 を使って Python でデータを永続的に保存する
もし、Pythonでデータを保存するために永続的なデータベースを使用したい場合、Sqliteデータベースを使用するためのAPIを提供する sqlite3
ライブラリを使用することができます。
これも標準ライブラリの一部なので、Pipでインストールする必要はない。
しかし、これはリレーショナルデータベースなので、 pickle
のようにPythonオブジェクトを直接ダンプすることはできません。
適切なデータベース型にシリアライズ、デシリアライズする必要があります。
いくつかの例を見るには、Pythonでsqliteを使うという記事を参照してください。
3. SqliteDict を永続的なキャッシュとして使用する
もし、 sqlite3
を使うのが面倒だと感じるなら、もっと良い解決策がある! このパッケージは内部的に sqlite3
データベースを使用して、永続的なデータの保存を行うことができる。
このパッケージはpipでインストールする必要がある。
pip install sqlitedict
|
注意しなければならないのは、辞書のように key:value
マッピングを使用してデータを保存/取得する必要があるということです!
ここでは、MyClass
インスタンスを使用した簡単な例を紹介します。
from sqlitedict import SqliteDict
class MyClass():
def __init__( self , param):
self .param = param
def save(key, value, cache_file = "cache.sqlite3" ):
try :
with SqliteDict(cache_file) as mydict:
mydict[key] = value # Using dict[key] to store
mydict.commit() # Need to commit() to actually flush the data
except Exception as ex:
print ( "Error during storing data (Possibly unsupported):" , ex)
def load(key, cache_file = "cache.sqlite3" ):
try :
with SqliteDict(cache_file) as mydict:
value = mydict[key] # No need to use commit(), since we are only loading data!
return value
except Exception as ex:
print ( "Error during loading data:" , ex)
obj1 = MyClass( 10 )
save( "MyClass_key" , obj1)
obj2 = load( "MyClass_key" )
print (obj1.param, obj2.param)
print ( isinstance (obj1, MyClass), isinstance (obj2, MyClass))
|
結果は以下の通りです。
10 10
True True
|
確かに、Pythonオブジェクトのロードに成功しました。
もし、sqlitedict
がデータベース cache.sqlite3
を作成していなければ、自動的に作成し、それを使ってデータの保存や読み込みを行います。
まとめ
この記事では、Pythonを使用してさまざまな方法でデータを保存する方法を見てきました。