web-dev-qa-db-ja.com

ipython Notebook形式への(からではなく)変換

IPython Notebookには nbconvert が付属しており、ノートブックを他の形式にexportできます。しかし、テキストを逆方向に変換するにはどうすればよいですか?別の形式の素材と優れたワークフローを既に持っているのでお願いしますが、Notebookのインタラクティブな環境を活用したいと思います。

考えられる解決策:ノートは、.pyファイル、およびドキュメントには、nbconvertがノートブックをpythonスクリプトとしてエクスポートするとき、ノートブックを再作成するために使用できるコメントにディレクティブを埋め込みます。このメソッドの制限について 免責事項 が付属しており、受け入れられる形式は私が見つけることができるどこにも文書化されていません(奇妙なことに、ノートブックの説明セクションにサンプルが表示されます JSON format )。誰でもより多くの情報を提供できますか?

編集(2016年3月1日):何らかの理由でこの入力形式はノートブックAPIのバージョン4でサポートされていないため、受け入れられた回答は機能しなくなりました。 a-self-answerを追加しました。現在の(v4)APIでノートブックをインポートする方法を示しています。 (現時点での問題を解決し、自己回答で使用したリソースを指摘してくれたため、現在の回答を受け入れていません。)

51
alexis

以下はIPython 3で機能しますが、IPython 4では機能しません。

IPython APIには、ノートブックファイルを読み書きするための関数があります。このAPIを使用し、JSONを直接作成しないでください。たとえば、次のコードスニペットは、スクリプトtest.pyをノートブックtest.ipynbに変換します。

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

Edit:この回答はもともとIPyhton 3向けに書かれたものです。IPython4でこれを適切に行う方法がわかりません。 IPython 3.2.1リリースのnbpy.pyのバージョンを指す上記のリンク:

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

基本的に、# <codecell># <markdowncell>などの特別なコメントを使用して、個々のセルを区切ります。完全なリストについては、line.startswithPyReader.to_notebookステートメントを参照してください。

34
CliffordVienna

受け入れられた回答のコードはもう機能しないため、現在の(_v4_)APIを使用してノートブックにインポートする方法を示すこの自己回答を追加しました。

入力形式

IPython Notebook APIのバージョン2および3は、特別な構造化コメント付きのpythonスクリプトをインポートし、必要に応じてセルに分割できます。サンプル入力ファイル(元のドキュメント こちら )。最初の2行は無視され、オプションです(実際、読者はファイル内の_coding:_および_<nbformat>_行を無視します)。

_# -*- 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は、廃止されたディレクティブ_<htmlcell>_および_<headingcell level=...>_も受け入れます。これらはすぐに他のタイプに変換されます。)

インポート方法

何らかの理由で、この形式はNotebook APIのバージョン4ではサポートされていません。まだナイス形式なので、バージョン3にインポートしてアップグレードすることでサポートするのは面倒です。 原則としては、2行のコードに加えて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>_セルを追加することです。バグによって削除され、誰もが満足します。 textv3.reads_py()に渡す前に、以下を実行してください。

_text += """
# <markdowncell>

# If you can read this, reads_py() is no longer broken! 
"""
_
31
alexis

非常に古い質問です。しかし、 jupytextpypi でも利用可能)があり、ipynbから複数の形式に変換したり、逆に変換したりできます。

jupytextがインストールされている場合、使用できます

$ jupytext --to notebook test.py

test.ipynbを生成するため。

jupytextには、ノートブックを操作する際に役立つ、もっと興味深い機能がたくさんあります。


最近の質問 そのトピックについてです。

12

IPythonノートブックV4をビルドするPythonコード例:

# -*- 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()
9
Volodimir Kopey

Volodimir Kopeyの例を考えて、.ipynbからエクスポートして取得した.pyをV4 .ipynbに変換するために必要最低限​​のスクリプトをまとめました。

ノートブックからエクスポートした.pyを(適切なIDEで)編集したときにこのスクリプトを一緒にハックし、ノートブックに戻ってセルごとに実行したいと考えました。

スクリプトはコードセルのみを処理します。とにかく、エクスポートされた.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)

保証はありませんが、うまくいきました

7
P.Toccaceli

P.Toccateliとalexisのコードを取得および変更して、セルマーカーのようなpycharmとspyderでも動作するように自由を取り、それを github でリリースしました。

4
John Smith

役立つかもしれないvscodeの拡張機能を作成しました。 pythonファイルをipythonノートブックに変換します。エラーが発生した場合は、問題を送信してください。

Jupyter Notebook Converter

4
YigitOzgumus

私は手遅れではないことを願っています。

Python PyPIでp2jと呼ばれるパッケージを公開しました。このパッケージはJupyterノートブック.ipynbを作成します。 a Pythonソースコード.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/raibosome/python2jupyter

2
Raimi bin Karim

https://github.com/sklam/py2nb からスクリプトpy2nbを使用できます。

* .pyには特定の構文を使用する必要がありますが、使用するのはかなり簡単です(「samples」フォルダーの例を見てください)

0
valbarriere