読者のこの記事では、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))
|
結果は以下の通りです。
10True |
古いデータの取得に成功しました!
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を使用してさまざまな方法でデータを保存する方法を見てきました。