V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XIVN1987
V2EX  ›  Jupyter

jupyter 转 markdown 要是能内嵌图片就好了

  •  
  •   XIVN1987 · 2020-12-30 00:33:37 +08:00 · 2224 次点击
    这是一个创建于 1422 天前的主题,其中的信息可能已经有所发展或是发生改变。

    jupyter 的 Fille -> Download as 可以将 notebook 转换成 markdown,方便记笔记

    可是 notebook 中的图片不会转换进 markdown 里,所以有较多图片的 notebook 转换成 markdown 就没啥意义了

    我看了下 notebook 是把图片内嵌进 xxx.ipynb 文件中的,要是转换成 markdown 时也能将图片内嵌进 markdown 就好了

    7 条回复    2020-12-31 17:30:02 +08:00
    neosfung
        1
    neosfung  
       2020-12-30 03:00:15 +08:00 via iPhone   ❤️ 1
    我记得输出 html 的时候是图片转换为 base64,可以试一下看看找一下相应的代码把这步嵌入到生成 markdown 中
    XIVN1987
        2
    XIVN1987  
    OP
       2020-12-30 09:35:40 +08:00
    @neosfung
    确实,html 输出中通过<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">语法内嵌了图片

    查了下这个语法叫 Data URI scheme,,希望 markdown 也能支持这种用法,,这样笔记会方便很多

    感谢指点
    neosfung
        3
    neosfung  
       2020-12-30 18:54:10 +08:00 via iPhone   ❤️ 1
    @XIVN1987 markdown 我记得支持的,这种常见的 html 标签
    XIVN1987
        4
    XIVN1987  
    OP
       2020-12-30 20:17:44 +08:00
    @neosfung
    感谢,,试了下确实支持

    之前测试不工作,原来是 jupyter 导出的时候多了两个换行,,为知笔记就不认了,,把换行去掉就可以了

    jupyter 导出的是

    ``` javascript
    <img src="data:image/png;base64,iVBO...
    "
    >
    ```

    改成

    ``` javascript
    <img src="data:image/png;base64,iVBO...">
    ```

    就可以了,,
    XIVN1987
        5
    XIVN1987  
    OP
       2020-12-30 21:25:46 +08:00
    XIVN1987
        6
    XIVN1987  
    OP
       2020-12-30 22:59:23 +08:00
    写了脚本,自动将 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)

    ```
    neosfung
        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
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3156 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 12:21 · PVG 20:21 · LAX 04:21 · JFK 07:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.