🙆‍♀️

jupyter-notebookにmarkdownエクスポートあったけど出力が趣味にあわなかったのでスクリプト書いた

2023/02/08に公開約1,700字

あまり知られてないと思われるというか、小生もわりと最近知ったのだが、jupyter-notebookにはエクスポート機能がある。

検索すると出てくるのはコマンドラインだが、当然のことながらUIにもメニューがある。

肝心のmarkdown出力は、やたらと空改行が多くて冗長に見えたため、小生の趣味には合わなかった。なので似たようなことをするpython3スクリプトを書いた。

一方、html出力は悪くなかった。別記事の検証につかったnotebookを出力した例を示す。

jupyter-notebookのノートブックは ipynb という拡張子にはなってるが、実は中身はただのJSONである。 オフィシャルでは英語の仕様書は存在する。

https://nbformat.readthedocs.io/en/latest/

.....しかし、それとは無関係に、jsonの中身を探検しながら書いたスクリプトがこれ。

#python3

import glob
import sys
import os.path
import json

def mdquote(q:str,ol:list):
    print(f"```{q}")
    print("".join(ol))
    print("```")
    print("")

for fn in sys.argv[1:] or glob.glob(f"*.ipynb"):
    rawnbbook = json.load(open(fn))
    bn = os.path.basename(fn)
    ##print(pno)
    assert rawnbbook["nbformat"]==4
    assert rawnbbook["metadata"]["kernelspec"]["name"] == "python3"
    ##print()
    sys.stdout = open(f"{bn}.md","w")
    for cell1 in rawnbbook["cells"]:
        mdquote("python",cell1["source"])
        for outputpartial in cell1["outputs"]:
            if outputpartial["output_type"] == "stream":
                print(">"+(">".join(outputpartial["text"])))
            elif outputpartial["output_type"] == "execute_result":
                for tt,vv in outputpartial["data"].items():
                    print(">"+(">".join(vv)))
            elif outputpartial["output_type"] == "error":
                print(">"+outputpartial["traceback"][-1])
            else:
                print(outputpartial)
            print("----")

Discussion

ログインするとコメントできます