将JSON格式的IPython笔记本(.ipynb)转换为.py文件

129

如何将一个IPython笔记本文件(扩展名为.ipynb的JSON格式)转换成常规的.py模块?


1
可能是重复的问题,参考如何通过命令行将IPython笔记本转换为Python文件? - Arya McCarthy
18个回答

176

从笔记本菜单中,您可以直接将文件保存为Python脚本。转到菜单的“文件”选项,然后选择“下载为”,您会看到一个“Python(.py)”选项。

enter image description here

另一个选择是使用命令行中的 nbconvert:
jupyter nbconvert --to script 'my-notebook.ipynb'

请看 这里


调用nbconvert的另一种方法是通过jupyter_notebook_confg.py文件在保存时自动执行--请参阅https://dev59.com/GOo6XIcBkEYKwwoYLhXh#25765194 - Dave X
我似乎没有安装ipython或jupyter,因此不知道如何进入笔记本菜单。 - Dave Sims
1
@DaveGoldsmith 运行 pip install jupyter。安装完成后,进入您的项目目录并运行 jupyter notebook。它应该会自动打开一个网页浏览器,否则请手动打开一个浏览器并访问 http://localhost:8888/notebooks/ 开始创建或处理笔记本。 - WordBrewery
有没有一种方法可以在 a.py 文件中获取输出文本? - Scope
1
无法与 ipython [8.7.0] 兼容。返回警告:未识别的别名:'to',它将不起作用。文件 'nbconvert' 不存在 - DannyDannyDanny
在较新的Jupyter版本中,似乎不需要使用引号进行包装,因此要达到相同的结果,命令应该是jupyter nbconvert --to script my-notebook.ipynb - undefined

40

2
现在收到此通知,供参考: [TerminalIPythonApp] WARNING | 子命令 'ipython nbconvert' 已被弃用并将在未来版本中删除。 [TerminalIPythonApp] WARNING | 你可能想在未来使用 'jupyter nbconvert'。 - Matt
1
@Matt ipython已更名为jupyter。该消息告诉您旧的可执行文件名称已被弃用,但转换命令本身并没有。 - Adam
3
@Adam,我明白了。我想记录下正确的可执行文件。 - Matt

37
简而言之:这个命令行选项将mynotebook.ipynb转换为python代码: jupyter nbconvert mynotebook.ipynb --to python 注意:这与上述答案不同。 ipython已更名为jupyter。旧的可执行文件名(ipython)已弃用。
更多细节: jupyter 命令行有一个 nbconvert 参数,可以将笔记本文件 (*.ipynb) 转换为各种其他格式。
您甚至可以使用相同的命令但不同的 --to 选项将其转换为以下任何一种格式之一:
- asciidoc - custom - html - latex。 (如果您想在会议/期刊论文中粘贴代码,这非常棒)。 - markdown - notebook - pdf - python - rst - script - slides。 (哇!将其转换为幻灯片以便轻松演示)
同样的命令 jupyter nbconvert --to latex mynotebook.ipynb 有关更多信息,请参见 jupyter nbconvert --help。 这里有很多选项。 您甚至可以在转换之前先执行代码,不同的日志级别选项等。

这与@Kush的答案并没有真正的不同,只是自他回答以来命令名称已更改。 - James Hirschorn

17

你可以使用这个来做那个:

pip install ipynb-py-convert

然后在终端中运行以下命令将 .py 文件转换为 .ipynb 文件:

ipynb-py-convert Ex/abc.py Ex/abc.ipynb

将 .ipynb 文件转换为 .py:

ipynb-py-convert Ex/abc.ipynb Ex/abc.py

4
您可以在同一目录下运行一个 .py 文件:
import json

files = ["my_first_file_name.ipynb", "my_second_file_name.ipynb"]

for file in files:
    code = json.load(open(file))
    py_file = open(f"{file}.py", "w+")

    for cell in code['cells']:
        if cell['cell_type'] == 'code':
            for line in cell['source']:
                py_file.write(line)
            py_file.write("\n")
        elif cell['cell_type'] == 'markdown':
            py_file.write("\n")
            for line in cell['source']:
                if line and line[0] == "#":
                    py_file.write(line)
            py_file.write("\n")

    py_file.close()

我从Syrtis Major的回答中重写了这段代码。


最佳答案可用。不需要使用jupyter nbconvert,只需使用标准的json格式获取笔记本。绝对精彩! - Farhan Hai Khan

4

Ubuntu 20.04 上进行测试。

安装 PIP 所需的软件包。

$ pip install ipython
$ pip install nbconvert

安装所需的软件包
$ sudo apt-get install texlive-xetex texlive-fonts-recommended texlive-plain-generic

方法一

使用 jupyter nbconvert 命令将文件转换为不同的格式。

源文件 pro.ipynb

pro.ipynb

  • To convert to ascii

    $ jupyter nbconvert --to asciidoc pro.ipynb
    
  • To convert to pdf

    $ jupyter nbconvert --to pdf pro.ipynb
    
  • To convert to python

    $ jupyter nbconvert --to python pro.ipynb
    

方法2

通过savefig 方法,使用pyplot 将 ipynb 项目转换为 Python 代码:

pro.ipynb

import matplotlib.pyplot as plt
%matplotlib inline
exp_vals=[1400,600,300,410,250]
exp_labels=['Home Rent','Food','Phone/Internet Bill','Car','Other Utilities']
plt.axis('equal')
plt.pie(exp_vals,labels=exp_labels,radius=2,autopct='%0.1f%%',shadow=True,explode=[0,0.5,0,0.3,0],startangle=20)
# plt.show()
plt.savefig('piechart.jpg',bbox_inches='tight',pad_inches=2,transparent=True,edgecolor='r')

它生成的piechart.png图像:

piechart.png

   Hope this helps to convert your ~(`)/\/\/\_ [Python] code

4

首先,您需要安装下面这个程序包:

sudo apt install ipython
jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

有两种选择可用,要么使用--to python,要么使用--to=python。

对我而言,这个选项可以正常工作:

jupyter nbconvert --to python while.ipynb 

[NbConvertApp] Converting notebook while.ipynb to python
[NbConvertApp] Writing 758 bytes to while.py

pip3 install ipython

如果这对您不起作用,请尝试使用pip3。

pip3 install ipython

3
你肯定可以使用nbconvert实现这一点,使用以下命令:
jupyter nbconvert --to python while.ipynb 

然而,出于以下几个原因,我个人建议不要使用nbconvert:
  1. 将代码转换为简单的Python代码一回事,确保所有正确的抽象、类访问和方法设置另一回事。如果你想通过将笔记本代码转换为Python代码来使你的代码和笔记本能够长期维护,那么仅靠nbconvert是不够的。唯一的方法是手动浏览代码库。
  2. 笔记本固有地促进编写不可维护的代码(https://docs.google.com/presentation/d/1n2RlMdmv1p25Xy5thJUhkKGvjtV-dkAIsUXP-AL4ffI/edit#slide=id.g3d7fe085e7_0_21)。在此基础上再使用nbconvert可能只会证明是治标不治本的做法。其中促进不太易维护的代码的具体示例包括:导入可能分散在各处,硬编码路径不在一个简单的位置查看,类抽象可能不存在等。
  3. nbconvert仍然混合了执行代码和库代码。
  4. 仍然没有注释(可能在笔记本中不存在)。
  5. 缺乏单元测试等。
因此,总结一下,没有一个好的方法可以直接将Python笔记本转换为易于维护、健壮的Python模块化代码,唯一的方法是手动进行修改。

2

如果这只是一次性的操作,可以根据需要选择使用命令行或GUI,例如关注@kikocorreoso。

然而,如果您想要一个能够维护.py和.ipynb同步版本的解决方案,您真的应该考虑使用jupytext,正如@Wayne所指出的那样。

运行conda install jupytextpip install jupytext

然后执行以下操作:jupytext --set-formats ipynb,py <file>.ipynb

为了将其与.py文件保持同步:

jupytext --set-formats ipynb,py <file>.ipynb --sync

这将确保Jupyter在保存时始终保持两个文件同步...

最后一点提示:如果您是GUI用户,在运行jupytext的安装命令后,其他所有操作也可以在GUI中完成:文件-->Jupytext-->将Notebook与轻量级脚本配对输入图像描述


ipynb,py 中的逗号困扰着我。 - Tom McKenzie

2
您可以使用以下脚本将jupyter笔记本转换为Python脚本,或直接查看代码。
要执行此操作,请将以下内容写入文件cat_ipynb中,然后运行chmod +x cat_ipynb
#!/usr/bin/env python
import sys
import json

for file in sys.argv[1:]:
    print('# file: %s' % file)
    print('# vi: filetype=python')
    print('')
    code = json.load(open(file))

    for cell in code['cells']:
        if cell['cell_type'] == 'code':
            print('# -------- code --------')
            for line in cell['source']:
                print(line, end='')
            print('\n')
        elif cell['cell_type'] == 'markdown':
            print('# -------- markdown --------')
            for line in cell['source']:
                print("#", line, end='')
            print('\n')

然后您可以使用以下命令:

cat_ipynb your_notebook.ipynb > output.py

或者直接使用vi查看:

cat_ipynb your_notebook.ipynb | view -


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