kei0425tan’s blog

技術的なことを主に

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などもあるが省略可能。

どうすれば?

こんなのを作ってみました。


gist53010bc269a7056e7f95ab9c19be6d20

使い方

いつも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以外全て)

※ この前ネットサーフィンしてみたら、このフォーマットで書くと分かりやすいとのことだったのでパクってみました!