如何从 Linux 终端清除所有单元格中的 Jupyter Notebook 输出?

How to clear Jupyter Notebook's output in all cells from the Linux terminal?

当笔记本的输出很长并且保存到笔记本中时,我遇到了一个问题,每当我想再次打开这个特定的笔记本时,浏览器就会崩溃并且无法正确显示。

要解决此问题,我必须使用文本编辑器打开它并删除导致该问题的单元格中的所有输出。

我想知道是否有一种方法可以清除笔记本中的所有输出,以便可以毫无问题地再次打开它。我想删除所有输出,因为删除特定输出似乎比较麻烦。

nbconvert 6.0 应该修复 --clear-output

这个选项之前已经坏了很长时间,错误报告与合并补丁:https://github.com/jupyter/nbconvert/issues/822

用法应用于就地操作:

jupyter nbconvert --clear-output --inplace my_notebook.ipynb

或者保存到另一个名为 my_notebook_no_out.ipynb 的文件:

jupyter nbconvert --clear-output \
  --to notebook --output=my_notebook_no_out my_notebook.ipynb

这引起了我的注意

nbconvert 6.0 之前:--ClearOutputPreprocessor.enabled=True

用法与--clear-output相同:

jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace my_notebook.ipynb
jupyter nbconvert --ClearOutputPreprocessor.enabled=True \
  --to notebook --output=my_notebook_no_out my_notebook.ipynb

在 Jupyter 4.4.0 中测试,notebook==5.7.6。

使用--ClearOutputPreprocessor.enabled=True--clear-output

执行此命令:

jupyter nbconvert --ClearOutputPreprocessor.enabled=True --clear-output *.ipynb

使用clean_ipynb,它不仅可以清除笔记本输出,还可以清理代码。

通过 pip install clean_ipynb

安装

运行 来自 clean_ipynb hello.ipynb

如果您创建 .gitattributes file,您可以 运行 在将某些文件添加到 git 之前对其进行过滤。这将原样保留磁盘上的原始文件,但提交 "cleaned" 版本。

为此,请将其添加到本地 .git/config 或全局 ~/.gitconfig:

[filter "strip-notebook-output"]
    clean = "jupyter nbconvert --ClearOutputPreprocessor.enabled=True --to=notebook --stdin --stdout --log-level=ERROR"

然后在你的笔记本目录中创建一个.gitattributes文件,用这个 内容:

*.ipynb filter=strip-notebook-output

这是如何工作的:

  • 属性告诉 git 运行 过滤器对每个笔记本文件的 clean 操作,然后再将其添加到索引(暂存)。
  • 过滤器是我们的朋友 nbconvert,设置为从 stdin 读取,写入 stdout,剥离输出,并且只在有重要事情要说时才说话。
  • 当从索引中提取文件时,过滤器的 smudge 操作是 运行,但这是一个空操作,因为我们没有指定它。您可以在此处 运行 您的笔记本重新创建输出 (nbconvert --execute)。
  • 请注意,如果过滤器因某种原因失败,文件将被暂存而不进行转换。

我对这个过程唯一的小抱怨是我可以提交 .gitattributes 但我必须告诉我的同事更新他们的 .git/config

如果您想要更黑客但速度更快的版本,请尝试 JQ:

  clean = "jq '.cells[].outputs = [] | .cells[].execution_count = null | .'"

扩展@dirkjot 的答案以解决有关共享配置的问题:

创建本地 .gitconfig 文件,而不是修改 .git/config。这使得在其他机器上需要 运行 的命令稍微简单一些。您还可以为 运行 git config 命令创建一个脚本:

git 配置 --local include.path ../.gitconfig

请注意,我也已将日志级别更改为 INFO,因为我确实希望确认清理已 运行ning。

repo/.gitconfig

[filter "strip-notebook-output"]
    clean = "jupyter nbconvert --ClearOutputPreprocessor.enabled=True --to=notebook --stdin --stdout --log-level=INFO"

repo/.git属性

*.ipynb filter=strip-notebook-output

repo/git_configure.sh

git config --local include.path ../.gitconfig

然后用户只需要 运行:

$ chmod u+x git_configure.sh
$ ./git_configure.sh

我必须说,我发现 jupyer nbconvert 对于清除一些子数组和重置一些执行编号这样简单的工作来说,速度非常慢。这是可维护性方面的卓越解决方案,因为如果笔记本源代码格式发生变化,该工具将得到更新。然而,下面的替代解决方案更快,如果您没有 nbconvert 6.0 也可能有用(我现在有一个环境 运行 5.6.1…)

一个非常简单的 jq (a sort of sed for json) 脚本可以非常快速地完成任务:

jq 'reduce path(.cells[]|select(.cell_type == "code")) as $cell (.; setpath($cell + ["outputs"]; []) | setpath($cell + ["execution_count"]; null))' notebook.ipynb > out-notebook.ipynb

非常简单,它识别代码单元,并分别用 []null 替换它们的 outputsexecution_count 属性。


或者如果你只想删除输出并保留执行编号,你可以做的更简单:

jq 'del(.cells[]|select(.cell_type == "code").outputs[])' notebook.ipynb > out-notebook.ipynb

nbstripout 对我来说效果很好。

打开 Jupyter 终端,导航到包含笔记本的文件夹,然后运行以下行:

nbstripout my_notebook.ipynb