如何通过命令行将IPython笔记本转换为Python文件?
我正在考虑使用*.ipynb文件作为真相的来源,并通过编程将它们“编译”成.py文件,以用于计划的作业/任务如何通过命令行将IPython笔记本转换为Python文件?,ipython,ipython-notebook,Ipython,Ipython Notebook,我正在考虑使用*.ipynb文件作为真相的来源,并通过编程将它们“编译”成.py文件,以用于计划的作业/任务 我理解这样做的唯一方法是通过GUI。是否有办法通过命令行执行此操作?如果不希望每次保存时都输出Python脚本,或者不希望重新启动IPython内核: 在命令行上,您可以使用: 作为一种黑客,您甚至可以通过预挂起在IPython笔记本中调用上述命令(用于任何命令行参数)。在笔记本内: !jupyter nbconvert --to script config_template.ipynb
我理解这样做的唯一方法是通过GUI。是否有办法通过命令行执行此操作?如果不希望每次保存时都输出Python脚本,或者不希望重新启动IPython内核: 在命令行上,您可以使用: 作为一种黑客,您甚至可以通过预挂起
在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 lib版本
:
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
自动创建
最后我写道:
要使用此脚本,可以将其添加到~/.jupyter/jupyter\u notebook\u config.py
:)
请注意,您可能需要重新启动jupyter笔记本电脑/实验室才能使其工作。很高兴您的工具链中有这样的转换。它不仅允许从笔记本到脚本的转换,而且还可以从脚本返回到笔记本。甚至把那本笔记本做成了成品
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
有一个非常好的包,名为,它是为在Jupyter笔记本中编写Python包而设计的。与nbconvert类似,它可以将笔记本转换为.py文件,但它更灵活、更强大,因为它有许多很好的附加创作功能,可以帮助您在PyPI上开发测试、文档和注册软件包。它是由fast.ai开发的
它有一点学习曲线,但文档很好,总体来说并不困难。下面的示例将一个名为
a_Notebook.ipynb
的铁皮Python笔记本变成了一个名为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文件 我的搜寻把我带到了 通过以下步骤,我能够获得.py文件
>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脚本,根据我们的示例,它将在我的mint[ubuntu]系统上创建
开始使用kaggle titanic problem.py
文件,即使jupyter已经安装,笔记本也可以使用,jupyter-nbconvert--to-script
给出了错误,在我做单独的测试之前,没有文件/目录
sudo apt-get install jupyter-nbconvert
然后一切都很好的转换。我只是想添加此项,以防任何人遇到相同的错误(对我来说,这是令人困惑的,因为我认为无文件错误指的是笔记本,它肯定在本地目录中,我花了一段时间才意识到没有安装子命令)。你所说的“真相来源”是什么意思?IPython笔记本只是json文件。您可以加载它们并作为Python字典进行操作。对于源代码,您应该迭代
输入
键,其中单元格类型
等于“code”。看看这个,我想将.ipynb存储在存储库中,而不是.py文件。因此,作为“构建步骤”,我将把.ipynb转换为.py文件,供自动化系统实际使用。你说得对,我可以加载json并只输出代码单元格,但我想知道是否有什么东西已经为我做到了:)@StefanKrawczyk你能把一个aswer标记为已接受吗?我建议您使用wwwilliam的Asnweri,如果您确实希望每次保存一个,那么在jupyter
中,您可以通过保存前或保存后挂钩触发nbconvert
:ContentsManager.pre\u save\u hookabdFileContentsManager.post\u save\u hook
。您可以添加一个post save hookjupyter nbconvert--to script[notebook]
是否有方法实现相反的操作,即从python脚本转换到笔记本。例如,拥有一些解析为单元格的专用文档字符串?将文件夹中的所有笔记本转换为script/path/to/notebooks/*。ipynb谢谢,它可以工作!,但是,如果我不想在[]中输入。:
在脚本中键入内容,我希望它是干净的。“有什么办法可以做到这一点吗?”RishabhAgrahari似乎对我很有用<代码>!jupyter nbconvert--到脚本--没有提示notebook.ipynb如果您不想安装任何jupyter工具,最好的答案。我喜欢这个。但当我从Jupyter笔记本下载.py格式时,我发现它使用UNIX行结尾,即使我使用的是w
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)
sudo apt-get install jupyter-nbconvert