使用nbconvert转换Notebook为Markdown时如何取消代码输出缩进?
nbconvert转换Markdown时代码输出自带前置4空格缩进的解决方案
这是nbconvert内置Markdown导出模板的默认逻辑:为了视觉上区分原代码块和对应运行输出,模板会自动给所有文本类运行输出加上4个空格的前置缩进,把内容归到带缩进的块结构里,无法满足无缩进的输出要求。
方法1:自定义轻量模板快速实现(推荐)
不需要修改全局配置,单次转换就能生效:
- 在执行nbconvert命令的工作目录下,新建模板文件
no_indent_output.tpl.j2,写入如下覆盖逻辑:
{%- extends 'markdown/index.j2' %} {# 覆盖标准输出、错误输出的渲染规则,去掉自动添加的缩进包裹 #} {%- block stream_stdout -%} {{ output.text | trim }} {%- endblock stream_stdout -%} {%- block stream_stderr -%} {{ output.text | trim }} {%- endblock stream_stderr -%} {# 覆盖代码执行结果输出的渲染规则,直接输出内容不缩进 #} {%- block execute_result -%} {{ output.data.get('text/markdown', output.data.get('text/plain', '')) | trim }} {%- endblock execute_result -%} {# 覆盖报错信息的渲染规则,去掉自动缩进 #} {%- block error -%} {{ output.traceback | join('\n') | trim }} {%- endblock error -%}
- 修改原本的转换命令,指定加载这个自定义模板运行:
jupyter nbconvert --execute --to markdown --template no_indent_output.tpl.j2 --output output.md notebook.ipynb
执行完成后生成的output.md中,所有代码运行输出都会完全去掉4个空格的前置缩进,保留输出内容本身的格式。
方法2:全局修改内置模板配置
如果不需要每次转换都额外指定模板参数,可以直接修改nbconvert的全局默认模板:
- 执行命令
jupyter --paths,找到输出结果中data目录对应的路径,进入路径下的nbconvert/templates/markdown文件夹 - 打开文件夹内的核心模板文件
index.j2,定位到所有为输出块添加4空格缩进的代码段,删除自动添加缩进的包裹逻辑,让输出内容直接按原文渲染 - 保存文件后,执行你原来的常规转换命令,就能直接生成无缩进的输出结果。
注意:如果Notebook中包含图片、嵌入HTML等非文本类输出,需要在自定义模板中补充对应类型输出的渲染规则,避免导出时这类内容丢失。
内容的提问来源于stack exchange,提问作者arnaud
相关产品推荐
相关产品推荐

