jupyter 的 Fille -> Download as 可以将 notebook 转换成 markdown,方便记笔记
可是 notebook 中的图片不会转换进 markdown 里,所以有较多图片的 notebook 转换成 markdown 就没啥意义了
我看了下 notebook 是把图片内嵌进 xxx.ipynb 文件中的,要是转换成 markdown 时也能将图片内嵌进 markdown 就好了
1
neosfung 2020-12-30 03:00:15 +08:00 via iPhone 1
我记得输出 html 的时候是图片转换为 base64,可以试一下看看找一下相应的代码把这步嵌入到生成 markdown 中
|
2
XIVN1987 OP @neosfung
确实,html 输出中通过<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">语法内嵌了图片 查了下这个语法叫 Data URI scheme,,希望 markdown 也能支持这种用法,,这样笔记会方便很多 感谢指点 |
4
XIVN1987 OP @neosfung
感谢,,试了下确实支持 之前测试不工作,原来是 jupyter 导出的时候多了两个换行,,为知笔记就不认了,,把换行去掉就可以了 jupyter 导出的是 ``` javascript <img src="data:image/png;base64,iVBO... " > ``` 改成 ``` javascript <img src="data:image/png;base64,iVBO..."> ``` 就可以了,, |
5
XIVN1987 OP |
6
XIVN1987 OP 写了脚本,自动将 jupyter 导出的 markdown 中的
``` ![png](output_3_0.png) ``` 替换成 ``` <img src="data:image/png;base64,iVBO..."> ``` 代码如下: ``` python #! python3 import os import re import binascii srcfil = r'C:\Users\WMX\Desktop\pylab\pylab.md' srcdir = os.path.dirname(srcfil) dstfil = os.path.join(srcdir, os.path.basename(srcfil).replace('.md', '_emb.md')) img_base64 = {} for root, dirs, files in os.walk(srcdir): for fname in files: if fname.endswith('.png'): img_data = open(os.path.join(root, fname), 'rb').read() img_base64[fname] = f'<img src="data:image/png;base64,{binascii.b2a_base64(img_data, newline=False).decode("latin-1")}">' content = open(srcfil, 'r', encoding='utf-8').read() for img in img_base64: content = re.sub(f'\n!\[png\]\({img}\)\n', f'\n{img_base64[img]}\n', content) open(dstfil, 'w', encoding='utf-8').write(content) ``` |
7
neosfung 2020-12-31 17:30:02 +08:00 1
我写了个钩子,每次保存 ipyhb 文件的时候保存同时输出 html 和 py 文件,方便记录实验数据( html )和 git 查看改动( py )
这是我的钩子 你可以把 markdown 的保存和改写都放进来 这样每次保存 ipyhb 的时候都可以得到相对应的 markdown 文件了 ```python ### If you want to auto-save .html and .py versions of your notebook: # modified from: https://github.com/ipython/ipython/issues/8009 import os from subprocess import check_call def post_save(model, os_path, contents_manager): """post-save hook for converting notebooks to .py scripts""" if model['type'] != 'notebook': return # only do this for notebooks d, fname = os.path.split(os_path) check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d) check_call(['ipython', 'nbconvert', '--to', 'html', fname], cwd=d) c.FileContentsManager.post_save_hook = post_save ``` |