複数のJupyter notebookをまとめてhtmlファイルに変換する


Jupyter notebookのipynbファイルが複数あって、それらをまとめてhtmlファイルに変換してから、一箇所にまとめたい場合に使えるスクリプトです。

ファイルが複数のフォルダにまたがって存在しても、再帰的にipynbファイルを検索して変換します。

まず結論から

以下のスクリプトを使って変換できます。

import shutil
from pathlib import Path
import subprocess

output_folder = "htmlファイルの保存先のフォルダパス"
notebook_folder = "ipynbファイルが保存されているフォルダのパス"

path_to_notebook_folder = Path(notebook_folder)
path_to_output_folder = Path(output_folder)

for path_to_ipynb in path_to_notebook_folder.rglob("*.ipynb"):
    print(str(path_to_ipynb))
    proc = subprocess.run(["jupyter", "nbconvert", "--to", "html", str(path_to_ipynb)], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    print(proc.stdout.decode("utf8"))
    print(proc.stderr.decode("utf8"))
    path_to_src_html = path_to_ipynb.with_suffix(".html")
    path_to_dest_html = path_to_output_folder.joinpath(path_to_src_html.name)
    shutil.move(str(path_to_src_html), str(path_to_dest_html))

コードについての説明

ファイルの再帰的検索

pathlib.Pathrglob("*.ipynb")によって、指定フォルダ以下のipynbファイルを再帰的に検索します。再帰的に検索したくない場合にはglob("*.ipynb")を使います。

for path_to_ipynb in path_to_notebook_folder.rglob("*.ipynb"):
    print(str(path_to_ipynb))

jupyter notebookのファイルをhtmlに変換

jupyter notebookのファイルをhtmlに変換するには、linuxコマンドとして

jupyter nbconvert --to html "ipynbファイルパス"

とします。

linuxコマンドをpythonで実行

linuxコマンドをpythonで実行するために、subprocess.runを使います。

subprocess.run(["jupyter", "nbconvert", "--to", "html", "ipynbファイルパス"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

pythonでファイルを移動

最後に、shutil.moveで生成したhtmlファイルを指定フォルダに移動します。

shutil.move(str(path_to_src_html), str(path_to_dest_html))