よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【Jupyter】マジックコマンドstoreで変数を保存する

今回は、JupyterNotebook(とJupyterLab)のマジックコマンド%storeの使い方。変数を保存できます。



【実行環境】



目次

マジックコマンド%storeの機能

Jupyterのセルで使用している変数を保存することができる。これを使うことにより、別のipynbファイルと変数が共有できたりするらしい。便利そうですね! (*´・ω・`)b。

保存した変数は、Jupyter上のデータベースにファイルとして保存されるとのこと。

保存場所は、 ~/.ipython/profile_default/db/autorestore 。ホームディレクトリの隠しフォルダ.ipythonの中。あとで覗いてみます。



たとえば pandas.read_csv(url)pandas.read_html(url)を使って、 ネット上のcsvファイルやWebページのテーブルを読み込むとします。データフレームにして変数dfに格納した。

一旦ipynbファイルを閉じてしまった後で再び変数dfOutで出力表示させようとすると、またネットからPandasで読み込む必要があります。
毎回同じファイルを同じネット上からダウンロードするのもアレですので、変数ごと保存しておけば手間が省けそうです。

ファイルに書き出しても出来ますけど、マジックコマンドで済むならそっちが早いだろう。

よし、使ってみましょう。\\\٩( 'ω' )و ////



マジックコマンド%storeの使用法

マジックコマンド 説明
%store 変数の一覧表示
%store -r 保存されている全ての変数の読込
%store 変数 変数をDBに保存
%store -d 変数 変数をDBから削除
%store -z 保存されている全ての変数の削除

%store 保存された変数の一覧取得

何も保存しておりませんので、何も表示されない筈ですが、一応。

%store
Stored variables and their in-db values:

空ということでよろしいのかな。



%store -r 保存された全ての変数の読み込み

空なので、読み込んでも空でしょうが、一応。

%store -r

何の表示もなし。



%store 変数 変数をデータベースに保存

適当に変数に値を代入して保存してみます。
文字列と、リストと、データフレームと3つ行ってみよう。

# 文字列
text = '本日は、晴天なり。'

# リスト
lst = [1, "二", ["three"]]

# データフレーム
import pandas as pd
df = pd.DataFrame([[1,2,3],[4,5,6]])

3つ同時に保存してみる。

# 変数を保存
%store text lst df
Stored 'text' (str)
Stored 'lst' (list)
Stored 'df' (DataFrame)

変数名と型が表示され、保存されたっぽい。



再び%storeで保存変数一覧を取得

# 保存された変数一覧を取得
%store
Stored variables and their in-db values:
df               ->    0  1  2
0  1  2  3
1  4  5  6
lst              -> [1, '二', ['three']]
text             -> '本日は、晴天なり。'

データベースに保存されている変数名と中身の一覧が表示された。



マジックコマンド%whoで変数名を確認

%whoを使うと、現在メモリ上に格納されている変数名が取得できる。

いま↑で作った変数名だけが表示される筈なので、見てみましょう。

# メモリ上の変数確認
%who
df   lst     text    

3つ出てきました。

メモリ上にない変数を使うと、

NameError:name '変数' is not defined

というエラーが出る。

# 未定義の変数を出力
v
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

/data/data/com.termux/files/usr/tmp/ipykernel_17506/2743148443.py in <module>
      1 # 未定義の変数を出力
----> 2 v


NameError: name 'v' is not defined



再び%store -rで保存された変数の呼び出し

一旦ipynbファイルを閉じます。そして↑の方で変数に値を代入したセルを実行せずに%store -rで保存変数を呼び出し、中身が表示されるかを確かめます。

(束の間)



と言うことで、ipynbを閉じて開きました。いきなり次を実行します。

# メモリ上の変数
%who
Interactive namespace is empty.

メモリ上は空です。

# データベースの変数を呼び出し
%store -r 

相変わらず何も表示されない。

しかし、データベースの変数全てを読み込んだので、メモリに確保されたはず。

# メモリ上に確保された変数名
%who
df   lst     text    

おお、変数が読み込まれている。



コードセルに書いて実行すれば、とうぜん値が表示される。トイヤッ!

# 文字列
print(text)

# リスト
print(lst)

# データフレーム(print関数を使わず表示)
df
本日は、晴天なり。
[1, '二', ['three']]
0 1 2
0 1 2 3
1 4 5 6

表示されました。ナイスです (^_^)v



別のipynbファイルで変数を共有する

別のファイルで%store 変数コマンドを使って変数をデータベースに保存し、このファイルで呼び出してみます。

(束の間)

別のipynbファイルで変数保存してきました。
データベースに保存された変数一覧を取得します。

# 保存変数一覧
%store
Stored variables and their in-db values:
comments             -> 'この変数とコメントは別のファイルでデータベースに保存しました。'
df                   ->    0  1  2
0  1  2  3
1  4  5  6
lst                  -> [1, '二', ['three']]
text                 -> '本日は、晴天なり。'

commentsという名前の変数が追加されています(追加しました)。

# メモリ上の変数名
%who
df   lst     text    

まだ変数commentsはメモリ上に無い。

保存の変数を読み込みます。

# 変数を読み込み 
%store -r

print(comments)
この変数とコメントは別のファイルでデータベースに保存しました。

変数を共有できました。便利ね、これ。



%store -d 変数で変数をデータベースから削除

変数commentstextを削除してみます。

# 変数をデータベースから削除
%store -d comments text

何も表示されません。

メモリ上とデータベース上の変数を確認します。

# メモリ上の変数
%who
comments     df  lst     text    

メモリ上にはまだ残っています。

# データベース上の変数一覧
%store
Stored variables and their in-db values:
df               ->    0  1  2
0  1  2  3
1  4  5  6
lst              -> [1, '二', ['three']]
text             -> '本日は、晴天なり。'

データベース上からは削除されています。しかし、textは残ったままですね。1つずつしか削除できないのか。



%store -zでデータベース上の全ての変数を削除

全ての変数を削除します。

その前に、ホームディレクトリの隠しフォルダの中にある変数保存先のファイルを確認しておこう。

# 変数保存先データベース
%ls ~/.ipython/profile_default/db/
autorestore/  dhist

ここのautorestore/というディレクトリの中に変数がファイルで保存されているらしい。

# 変数保存先データベース
%ls ~/.ipython/profile_default/db/autorestore
df  lst  text

catコマンドで直接読めるんだろうか?

%cat ~/.ipython/profile_default/db/autorestore/text
�X本日は、晴天なり。q.

読めるが、一部文字化けしてる。

%store -zでデータベース上の変数を全て削除

全部削除します。

# データベース上の変数一覧
%store
Stored variables and their in-db values:
df               ->    0  1  2
0  1  2  3
1  4  5  6
lst              -> [1, '二', ['three']]
text             -> '本日は、晴天なり。'
# データベース上の変数を全て削除
%store -z

何も表示されず。

# データベース上の変数一覧取得
%store
Stored variables and their in-db values:

空になりました。



参考

Jupyter Notebookの基本操作を学ぶ - Qiita



【JupyterNotebook】マジックコマンド使用法基礎 - よちよちpython



おわりに

複数のipynbファイル間で共有したいデータや、ネットから読み込んだデータを一時的に変数で保存しておきたい時に使えば重宝しそうです。型も気にしなくて出来る。



以上です。