PythonでPickleやSQLiteを使ってデータを保存する方法

スポンサーリンク

読者のこの記事では、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を使用してさまざまな方法でデータを保存する方法を見てきました。


タイトルとURLをコピーしました