python-转换为(不是从)ipython Notebook表单

IPython Notebook随附.py,可将笔记本导出为其他格式。 但是,如何在相反方向转换文本? 我之所以问,是因为我已经有了不同格式的资料和良好的工作流程,但我想利用Notebook的交互式环境。

可能的解决方案:可以通过导入.py文件来创建笔记本,并且文档指出,当nbconvert将笔记本作为python脚本导出时,它将指令嵌入到可用于重新创建笔记本的注释中。 但是这些信息带有关于此方法局限性的免责声明,并且在我能找到的任何地方都没有记录接受的格式。 (很奇怪,在描述笔记本的JSON格式的部分中显示了一个示例)。 谁能提供更多信息,或者提供更好的选择?

编辑(2016年3月1日):接受的答案不再起作用,因为Notebook API的版本4不支持此输入格式。 我添加了一个自我解答,展示了如何使用当前(v4)API导入笔记本。 (我不接受当前的答案,因为它可以解决我当时的问题,并指出我在自我答案中使用的资源。)

9个解决方案
34 votes

以下内容适用于IPython 3,但不适用于IPython 4。

IPython API具有用于读取和写入笔记本文件的功能。 您应该使用此API,而不是直接创建JSON。 例如,以下代码段将脚本# <codecell>转换为笔记本# <markdowncell>

import IPython.nbformat.current as nbf
nb = nbf.read(open('test.py', 'r'), 'py')
nbf.write(nb, open('test.ipynb', 'w'), 'ipynb')

关于nbf.read理解的.py文件的格式,最好仅查看解析器类IPython.nbformat.v3.nbpy.PyReader。 可以在这里找到代码(它不是很大):

[https://github.com/ipython/ipython/blob/master/jupyter_nbformat/v3/nbpy.py]

编辑:此答案最初是为IPyhton 3编写的。我不知道如何使用IPython 4正确执行此操作。这是上面链接的更新版本,指向IPython 3.2.1发行版的# <codecell>版本:

[https://github.com/ipython/ipython/blob/rel-3.2.1/IPython/nbformat/v3/nbpy.py]

基本上,您使用特殊注释(例如# <codecell># <markdowncell>)来分隔各个单元格。 请查看PyReader.to_notebook中的line.startswith语句以获取完整列表。

CliffordVienna answered 2020-01-14T07:18:53Z
32 votes

由于接受的答案中的代码不再起作用,因此我添加了此自我答案,该答案显示了如何使用当前(v3.reads_py())API导入笔记本。

输入格式

IPython Notebook API的版本2和3可以导入带有特殊结构注释的python脚本,并根据需要将其分解为单元格。 这是一个示例输入文件(此处为原始文档)。 前两行被忽略,并且是可选的。 (实际上,读者将忽略文件中任何位置的v3.reads_py()<markdown>行。)

# -*- coding: utf-8 -*-
# <nbformat>3.0</nbformat>

# <markdowncell>

# The simplest notebook. Markdown cells are embedded in comments, 
# so the file is a valid `python` script. 
# Be sure to **leave a space** after the comment character!

# <codecell>

print("Hello, IPython")

# <rawcell>

# Raw cell contents are not formatted as markdown

(API还接受过时的指令2701947954910462462和<markdown>,它们会立即转换为其他类型。)

如何汇入

由于某些原因,Notebook API的版本4不支持此格式。 它仍然是一种不错的格式,因此通过导入到版本3并进行升级来支持它是值得的麻烦。 原则上,这只是两行代码以及I / O:

from IPython.nbformat import v3, v4

with open("input-file.py") as fpin:
    text = fpin.read()

nbook = v3.reads_py(text)
nbook = v4.upgrade(nbook)  # Upgrade v3 to v4

jsonform = v4.writes(nbook) + "\n"
with open("output-file.ipynb", "w") as fpout:
    fpout.write(jsonform)

但是没有那么快! 实际上,笔记本API有一个讨厌的错误:如果输入中的最后一个单元格是降价单元格,则v3.reads_py()将丢失它。 最简单的解决方法是在末尾添加一个伪造的<markdown>单元:该错误将其删除,每个人都很高兴。 在将text传递给v3.reads_py()之前,请执行以下操作:

text += """
# <markdowncell>

# If you can read this, reads_py() is no longer broken! 
"""
alexis answered 2020-01-14T07:19:41Z
15 votes

我知道很老的问题。 但是有jupytext(也可以在pypi上获得),可以将jupytext转换成多种格式并返回。

安装jupytext后,您可以使用

$ jupytext --to notebook test.py

为了生成jupytext

jupytext具有许多有趣的功能,在使用笔记本电脑时可以派上用场。


这是有关该主题的最新问题。

hiro protagonist answered 2020-01-14T07:20:19Z
9 votes

Python代码示例如何构建IPython Notebook V4:

# -*- coding: utf-8 -*-
import os
from base64 import encodestring

from IPython.nbformat.v4.nbbase import (
    new_code_cell, new_markdown_cell, new_notebook,
    new_output, new_raw_cell
)

# some random base64-encoded *text*
png = encodestring(os.urandom(5)).decode('ascii')
jpeg = encodestring(os.urandom(6)).decode('ascii')

cells = []
cells.append(new_markdown_cell(
    source='Some NumPy Examples',
))


cells.append(new_code_cell(
    source='import numpy',
    execution_count=1,
))

cells.append(new_markdown_cell(
    source='A random array',
))

cells.append(new_raw_cell(
    source='A random array',
))

cells.append(new_markdown_cell(
    source=u'## My Heading',
))

cells.append(new_code_cell(
    source='a = numpy.random.rand(100)',
    execution_count=2,
))
cells.append(new_code_cell(
    source='a = 10\nb = 5\n',
    execution_count=3,
))
cells.append(new_code_cell(
    source='a = 10\nb = 5',
    execution_count=4,
))

cells.append(new_code_cell(
    source=u'print "ünîcødé"',
    execution_count=3,
    outputs=[new_output(
        output_type=u'execute_result',
        data={
            'text/plain': u'<array a>',
            'text/html': u'The HTML rep',
            'text/latex': u'$a$',
            'image/png': png,
            'image/jpeg': jpeg,
            'image/svg+xml': u'<svg>',
            'application/json': {
                'key': 'value'
            },
            'application/javascript': u'var i=0;'
        },
        execution_count=3
    ),new_output(
        output_type=u'display_data',
        data={
            'text/plain': u'<array a>',
            'text/html': u'The HTML rep',
            'text/latex': u'$a$',
            'image/png': png,
            'image/jpeg': jpeg,
            'image/svg+xml': u'<svg>',
            'application/json': {
                'key': 'value'
            },
            'application/javascript': u'var i=0;'
        },
    ),new_output(
        output_type=u'error',
        ename=u'NameError',
        evalue=u'NameError was here',
        traceback=[u'frame 0', u'frame 1', u'frame 2']
    ),new_output(
        output_type=u'stream',
        text='foo\rbar\r\n'
    ),new_output(
        output_type=u'stream',
        name='stderr',
        text='\rfoo\rbar\n'
    )]
))

nb0 = new_notebook(cells=cells,
    metadata={
        'language': 'python',
    }
)

import IPython.nbformat as nbf
import codecs
f = codecs.open('test.ipynb', encoding='utf-8', mode='w')
nbf.write(nb0, f, 4)
f.close()
Volodimir Kopey answered 2020-01-14T07:20:38Z
7 votes

给定Volodimir Kopey的示例,我整理了一个准系统脚本,将通过从.ipynb导出返回到V4 .ipynb所获得的.py转换为。

当我(在适当的IDE中)编辑从Notebook中导出的.py文件时,我一起砍掉了这个脚本,我想返回到Notebook以逐个单元地运行它。

该脚本仅处理代码单元。 无论如何,导出的.py不包含其他内容。

import nbformat
from nbformat.v4 import new_code_cell,new_notebook

import codecs

sourceFile = "changeMe.py"     # <<<< change
destFile = "changeMe.ipynb"    # <<<< change


def parsePy(fn):
    """ Generator that parses a .py file exported from a IPython notebook and
extracts code cells (whatever is between occurrences of "In[*]:").
Returns a string containing one or more lines
"""
    with open(fn,"r") as f:
        lines = []
        for l in f:
            l1 = l.strip()
            if l1.startswith('# In[') and l1.endswith(']:') and lines:
                yield "".join(lines)
                lines = []
                continue
            lines.append(l)
        if lines:
            yield "".join(lines)

# Create the code cells by parsing the file in input
cells = []
for c in parsePy(sourceFile):
    cells.append(new_code_cell(source=c))

# This creates a V4 Notebook with the code cells extracted above
nb0 = new_notebook(cells=cells,
                   metadata={'language': 'python',})

with codecs.open(destFile, encoding='utf-8', mode='w') as f:
    nbformat.write(nb0, f, 4)

没有保证,但是对我有用

P.Toccaceli answered 2020-01-14T07:21:12Z
4 votes

随意获取和修改P.Toccateli和alexis的代码,以便它也可以与pycharm和spyder一起使用,如细胞标记,并在github上发布。

John Smith answered 2020-01-14T07:21:32Z
4 votes

我为vscode编写了一个扩展程序,可能会有所帮助。 它将python文件转换为ipython笔记本。 它处于早期阶段,因此,如果发生任何错误,请随时提交问题。

Jupyter笔记本转换器

YigitOzgumus answered 2020-01-14T07:21:57Z
2 votes

希望我还不晚。

我刚刚在PyPI上发布了一个名为p2j的Python包。 该软件包从Python源代码.py创建Jupyter笔记本.py

pip install p2j
p2j script.py

.py文件生成的Jupyter笔记本示例:

Example of .ipynb generated from a .py file

PyPI:[https://pypi.org/project/p2j/]

GitHub:[https://github.com/remykarem/python2jupyter]

Raimi bin Karim answered 2020-01-14T07:22:34Z
0 votes

您可以使用[https://github.com/sklam/py2nb]中的脚本py2nb

您必须为* .py使用某种语法,但使用起来非常简单(请看“ samples”文件夹中的示例)

valbarriere answered 2020-01-14T07:22:59Z
translate from https://stackoverflow.com:/questions/23292242/converting-to-not-from-ipython-notebook-format