如何在Jupyter Notebook单元格开头添加代码及新单元格自动添加?
解决方案
一、批量修改现有Notebook的所有代码单元格
先提个关键点:%%capture是单元格魔法命令,必须放在单元格第一行才能生效,没法嵌套在if语句里。所以换个更靠谱的方式——用IPython的capture上下文管理器,这样就能在条件判断里灵活控制输出捕获了。
批量修改脚本
用nbformat库就能批量改.ipynb文件,自动给所有代码单元格加上输出控制代码,步骤如下:
- 先装依赖:
pip install nbformat
- 运行下面的Python脚本(把
your_notebook.ipynb换成你的文件名):
import nbformat # 读取Notebook文件 nb = nbformat.read("your_notebook.ipynb", as_version=4) # 遍历所有单元格 for cell in nb.cells: # 只处理代码单元格,忽略markdown单元格 if cell.cell_type == "code": # 要插入的控制代码 prefix_code = """# 控制输出显示 from IPython.utils.capture import capture if do_not_show: with capture(): """ # 把原单元格的代码缩进4格,塞进with块里 indented_source = "\n".join([" " + line for line in cell.source.splitlines()]) # 拼接成新的单元格内容 cell.source = prefix_code + "\n" + indented_source # 保存修改后的Notebook(生成新文件,避免覆盖原文件) nbformat.write(nb, "your_notebook_modified.ipynb")
注意:确保你的Notebook开头已经定义了do_not_show = True这个变量,不然控制逻辑不会生效。
二、新建单元格自动加输出控制代码
方法1:修改Jupyter默认代码模板
直接改Jupyter的配置,让新建的代码单元格默认带上控制代码:
- 先生成配置文件(如果还没生成过):
jupyter notebook --generate-config
- 打开生成的配置文件(一般在
~/.jupyter/jupyter_notebook_config.py),找到对应的行改成这样:
c.ContentsManager.default_cell_type = 'code' c.CodeCell.default_source = """# 控制输出显示 from IPython.utils.capture import capture if do_not_show: with capture(): # 在这里写你的代码 """
方法2:用Jupyter扩展快速插代码
不想改全局配置的话,用jupyter_contrib_nbextensions的代码片段功能也行:
- 装扩展:
pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user
- 启动Jupyter Notebook,打开"Nbextensions"标签,启用"Snippets"扩展
- 在Snippets里加个自定义片段,内容就是输出控制代码,再设个快捷键,新建单元格后按快捷键就能快速插进去
更简单的替代方案:推送前清掉所有输出
其实还有个更省事的办法——推送前直接清掉Notebook的所有输出:
- 在Jupyter里点
Kernel > Restart & Clear Output,然后保存文件就行 - 或者用命令行批量清理:
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace your_notebook.ipynb
内容的提问来源于stack exchange,提问作者DayG
相关产品推荐
相关产品推荐

