如何通过命令行将IPython Notebook转换为Python文件?

我正在考虑使用* .ipynb文件作为真相的来源,并以编程方式将它们“编译”为.py文件,用于计划的作业/任务。

我所理解的做到这一点的唯一方法是通过GUI。有没有办法通过命令行来实现?

396470 次浏览

如果你不想每次保存时都输出一个Python脚本,或者你不想重新启动IPython内核:

命令行上,你可以使用nbconvert:

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

作为一个小hack, 你甚至可以把上面的in调用为IPython笔记本通过预先挂起!(用于任何命令行参数)。在笔记本里:

!jupyter nbconvert --to script config_template.ipynb

--to script添加之前,选项是--to python--to=python,但在向语言无关的笔记本系统发展时,选项是重命名

您可以从IPython API完成此操作。

from IPython.nbformat import current as nbformat
from IPython.nbconvert import PythonExporter


filepath = 'path/to/my_notebook.ipynb'
export_path = 'path/to/my_notebook.py'


with open(filepath) as fh:
nb = nbformat.reads_json(fh.read())


exporter = PythonExporter()


# source is a tuple of python source code
# meta contains metadata
source, meta = exporter.from_notebook_node(nb)


with open(export_path, 'w+') as fh:
fh.writelines(source)

下面是一种不使用ipython就可以从V3或V4 ipynb中提取代码的快速而简单的方法。它不检查单元格类型等。

import sys,json


f = open(sys.argv[1], 'r') #input.ipynb
j = json.load(f)
of = open(sys.argv[2], 'w') #output.py
if j["nbformat"] >=4:
for i,cell in enumerate(j["cells"]):
of.write("#cell "+str(i)+"\n")
for line in cell["source"]:
of.write(line)
of.write('\n\n')
else:
for i,cell in enumerate(j["worksheets"][0]["cells"]):
of.write("#cell "+str(i)+"\n")
for line in cell["input"]:
of.write(line)
of.write('\n\n')


of.close()

与前面的例子相同,但使用新的nbformat库版本:

import nbformat
from nbconvert import PythonExporter


def convertNotebook(notebookPath, modulePath):


with open(notebookPath) as fh:
nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)


exporter = PythonExporter()
source, meta = exporter.from_notebook_node(nb)


with open(modulePath, 'w+') as fh:
fh.writelines(source.encode('utf-8'))

用于转换所有*。Ipynb将当前目录下的文件递归格式化为python脚本:

for i in *.ipynb **/*.ipynb; do
echo "$i"
jupyter nbconvert  "$i" "$i"
done

如果你想将当前目录中的所有*.ipynb文件转换为python脚本,你可以像这样运行命令:

jupyter nbconvert --to script *.ipynb

我遇到了这个问题,并试图在网上找到解决方案。虽然我找到了一些解决方案,但它们仍然存在一些问题,例如,当你从仪表板启动一个新笔记本时,烦人的Untitled.txt自动创建。

所以最终我写了我自己的解决方案:

import io
import os
import re
from nbconvert.exporters.script import ScriptExporter
from notebook.utils import to_api_path




def script_post_save(model, os_path, contents_manager, **kwargs):
"""Save a copy of notebook to the corresponding language source script.


For example, when you save a `foo.ipynb` file, a corresponding `foo.py`
python script will also be saved in the same directory.


However, existing config files I found online (including the one written in
the official documentation), will also create an `Untitile.txt` file when
you create a new notebook, even if you have not pressed the "save" button.
This is annoying because we usually will rename the notebook with a more
meaningful name later, and now we have to rename the generated script file,
too!


Therefore we make a change here to filter out the newly created notebooks
by checking their names. For a notebook which has not been given a name,
i.e., its name is `Untitled.*`, the corresponding source script will not be
saved. Note that the behavior also applies even if you manually save an
"Untitled" notebook. The rationale is that we usually do not want to save
scripts with the useless "Untitled" names.
"""
# only process for notebooks
if model["type"] != "notebook":
return


script_exporter = ScriptExporter(parent=contents_manager)
base, __ = os.path.splitext(os_path)


# do nothing if the notebook name ends with `Untitled[0-9]*`
regex = re.compile(r"Untitled[0-9]*$")
if regex.search(base):
return


script, resources = script_exporter.from_filename(os_path)
script_fname = base + resources.get('output_extension', '.txt')


log = contents_manager.log
log.info("Saving script at /%s",
to_api_path(script_fname, contents_manager.root_dir))


with io.open(script_fname, "w", encoding="utf-8") as f:
f.write(script)


c.FileContentsManager.post_save_hook = script_post_save

要使用此脚本,可以将其添加到~/.jupyter/jupyter_notebook_config.py:)

请注意,您可能需要重新启动jupyter笔记本/实验室才能工作。

在你的工具链中有Jupytext是很好的。它不仅允许从笔记本到脚本的转换,而且还可以从脚本返回到笔记本。甚至把那本笔记本打印出来。

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it

有一个非常好的包叫做nb_dev,它是为在Jupyter notebook中创建Python包而设计的。像nbconvert,一样,它可以把一个笔记本变成一个.py文件,但它更灵活和强大,因为它有很多不错的额外创作功能,可以帮助你在PyPI上开发测试、文档和注册包。它是快速发展起来的。人工智能的人。

它有一点学习曲线,但文档很好,总体上不难。

下面的例子将一个名为a_notebook.ipynb的Iron Python Notebook转换为一个名为a_python_script.py的Python脚本,省略了标记有remove关键字的单元格,我手动添加到我不想在脚本中结束的单元格中,省略了可视化和其他步骤,一旦我完成了笔记本,我不需要由脚本执行。

import nbformat as nbf
from nbconvert.exporters import PythonExporter
from nbconvert.preprocessors import TagRemovePreprocessor


with open("a_notebook.ipynb", 'r', encoding='utf-8') as f:
the_notebook_nodes = nbf.read(f, as_version = 4)


trp = TagRemovePreprocessor()


trp.remove_cell_tags = ("remove",)


pexp = PythonExporter()


pexp.register_preprocessor(trp, enabled= True)


the_python_script, meta = pexp.from_notebook_node(the_notebook_nodes)


with open("a_python_script.py", 'w', encoding='utf-8') as f:
f.writelines(the_python_script)

我知道这是一个老话题了。我也遇到过同样的问题,想通过命令行将.pynb文件转换为.py文件。

我的搜索把我带到了ipynb-py-convert

通过以下步骤,我能够得到.py文件

  1. 安装"pip Install "
  2. 通过命令提示符进入ipynb文件所在目录
  3. 输入命令

> ipynb-py-convert YourFileName.ipynb YourFilename.py

如:。ipynb-py-convert getting-started-with-kaggle-titanic-problem。ipynb getting-started-with-kaggle-titanic-problem.py

上面的命令将创建一个名为“yourfilename .py”的python脚本;根据我们的例子,它将创建getting-started-with-kaggle-titanic-problem.py文件

没有文件/目录错误

在我工作的mint [ubuntu]系统上,即使jupyter已经安装,笔记本电脑也可以工作,jupyter nbconvert --to script仍然给出了没有文件/目录错误,直到我做了一个单独的

sudo apt-get install jupyter-nbconvert

然后一切都很顺利。我只是想添加这个,以防有人碰到同样的错误(对我来说,这是令人困惑的,因为我认为没有文件错误指向笔记本,它肯定在本地目录中,我花了一段时间才意识到子命令没有安装)。

%notebook foo.ipynb魔术命令将当前的IPython导出到"foo.ipynb"

更多信息请输入%notebook?

使用nbconvert 6.07和jupyter client 6.1.12:

转换jupyter笔记本到python脚本

$ jupyter nbconvert mynotebook.ipynb --to python

转换jupyter笔记本到python脚本指定输出文件名

$ jupyter nbconvert mynotebook.ipnb --to python --output myscript.py

给出的解决方案仅适用于转换单个.py文件。下面是一个转换目录及其子目录中的所有.py文件的解决方案。

首先,您需要安装一次只转换一个文件的工具,如ipynb-py-convert

PIP安装ipynb-py-convert

然后cd到你的文件夹。py文件和目录的位置。然后我们在目录和子目录中的所有文件上递归地运行这个工具:

powershell:

foreach ($f在Get-ChildItem "过滤器*。ipynb-py-convert $f。FullName“$(美元f.FullName.Substring (0, f.FullName.Length-6)美元).py"}

现在,如果你想用批处理转换从。ipynb转换到。py,你可以运行:

foreach ($f在Get-ChildItem "-Filter *.py -递归){ipynb-py-convert $f。FullName“$(美元f.FullName.Substring (0, f.FullName.Length-3)美元).ipynb"}

这在我探索.py文件时给了我很大帮助。我做了一个项目的副本,运行这段代码,并快速在Jupiter测试代码的不同部分作为单元格等等。我希望它能帮助更多的人。

这里是一个jq解决方案,可能是有用的情况。记住,笔记本只是json。

jq -r '.cells[] | select(.cell_type  == "code") | .source[] | rtrimstr("\n")' $filename

我发现有两种方法转换Jupyter Notebook到普通的Python脚本命令行。下面是Jupyter笔记本的示例和两个工具的输出。

enter image description here

1. 使用nbconvert

nbconvert是在Jupyter Notebook User Interface中的Download as功能中使用的工具。它可以用作命令行工具:

jupyter nbconvert --to python notebook.ipynb
Python脚本示例: enter image description here < / p >

2. 使用jupytext

jupytext是一个保持.ipynb文件与.py文件同步的包。它还可以用于在命令行中转换.ipynb文件。它支持几种类型的转换:

转换为轻格式的Python脚本

jupytext --to py notebook.ipynb

python脚本示例:

enter image description here

转换为百分比格式的Python脚本

jupytext --to py:percent notebook.ipynb

Python脚本示例:

enter image description here