jupyter notebookファイルをバージョン管理したい
jupyter notebookの形式をいろいろ調べています。
jupyter 便利なのですが、書き捨てにすることが多く、バージョン管理したいと思ってもなかなかできないので作ってみました。
どういうこと?
jupyter notebookのipynbファイルはjsonなんですが、いろいろと実行時に変わってしまうデータがあって、そのままバージョン管理すると差分だらけで大変。
どうして?
jupyterのjsonの形式は以下になります。
※ ただし、nbformat: 4, nbformat_minor: 2 のもの
- ルート
キー | 種別 | 内容 |
cells | リスト | セルのリスト |
metadata | 辞書 | カーネル情報など |
nbformat | 数値 | ファイルフォーマットバージョン |
nbformat_minor | 数値 | ファイルフォーマットバージョン |
- セル
キー | 種別 | 内容 |
cell_type | 文字 | セルの種類code,markdown,rawの3種類 |
source | リスト | セルの入力内容。1行毎 |
metadata | 辞書 | その他の情報。拡張などで利用 |
- cell_type=codeの場合のみ
execution_count | 数値 | セルの実行回数(In [x]のxの数字)nullで指定なし。 |
outputs | 辞書 | 出力 |
他にも、scrolledなどもあるが省略可能。
使い方
いつもjupyter notebookを直接ライブラリ的に読み込んでいるのでこんな感じ。
%load_ext jupyter_cms
from mywb.ipynbconvert import save_py, load_py
コマンドラインで実行したい人は、mainつけてくださいね。
- pyに変換
save_py('xxxx.ipynb', 出力ファイル名(省略可能))
- 上記pyに変換したファイルからipynbに変換
load_py('xxxx.py', 出力ファイル名(省略可能))
注意
マジックコマンドなどそのまま出力されるため、そのまま実行は難しいです。
バージョン管理用ファイルになればよいかと思います。(diffもたぶん見やすいかと)
ダウロードpyとの違い
- マジックコマンドも表記のまま出力
- マークダウンコメントを"""で対応
- In [xx] は省略しているため、実行順など記録しないので差分をとりやすい。
- メタデータなどの保持(cells以外全て)
※ この前ネットサーフィンしてみたら、このフォーマットで書くと分かりやすいとのことだったのでパクってみました!