从Jupyter Notebook中提取代码

20

是否有办法提取笔记本中的所有代码? 例如,如果我想要生成一个名为“source.py”的源文件,其中包含笔记本电脑中代码单元格中的所有代码,这是否可能?

谢谢!

5个回答

28

nbconvert

您可以使用命令行工具nbconvert将ipynb文件转换为其他各种格式。

将其转换为.py文件的最简单方法是:

jupyter nbconvert --no-prompt --to script notebook_name.ipynb

它只输出代码和注释,而不包括markdown、输入和输出提示。还有--stdout选项。

jq

但您也可以使用jq解析笔记本的JSON:

jq -j '
  .cells
  | map( select(.cell_type == "code") | .source + ["\n\n"] )
  | .[][]
  ' \
  notebook.ipynb > source.py

13

你可以使用 文件 -> 下载为 -> Python (.py) 来导出所有代码单元格为一个单独的 .py 文件。


1
我觉得现在这个功能是不允许的。 - V-Mor
@V-Mor 这个选项只在 Jupyter Classic 中可用。对于 Jupyter Lab(Jupyter Classic 的更新替代品),请参见 https://dev59.com/q1QJ5IYBdhLWcg3wNi8h#66550565。 - wisbucky

5
如果您正在使用 jupyter lab,则选项是: 文件 > 另存为可执行脚本

1
哇,这真的非常不明显。他们应该在选项中添加文件扩展名,比如“可执行脚本(.py)”。 - wisbucky

2

有一个“丑陋”的解决方案。选择笔记本的所有单元格。合并它们,然后只需复制并粘贴所有代码。


巧妙,但不适用于多个笔记本。 - holdenweb

2
由于笔记本格式是JSON,所以相对容易提取仅包含代码单元格的文本内容。当您使用用于处理笔记本文件的Python API时,这项任务变得更加容易。
以下代码将在标准输出中获取代码。您可以轻松地使用其他方式处理它。请注意,代码源可能没有终止换行符。
from nbformat import read, NO_CONVERT

with open("Some Notebook.ipynb") as fp:
    notebook = read(fp, NO_CONVERT)
cells = notebook['cells']
code_cells = [c for c in cells if c['cell_type'] == 'code']
for cell in code_cells:
    print(cell['source'])

笔记本节点比字典更灵活,允许通过属性访问字段(例如`.name`),也允许通过下标访问(例如`['name']`)。作为一个不擅长打字的人,我觉得这样写更好。
cells = notebook.cells
code_cells = [c for c in cells if c.cell_type == 'code']

for cell in code_cells:
    print(cell.source)

回答这个问题时,我注意到nbformat库已经被拆分出来,因此可以使用pip安装,而无需安装Jupyter的其他部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接