IPython Notebookには nbconvert
が付属しており、ノートブックを他の形式にexportできます。しかし、テキストを逆方向に変換するにはどうすればよいですか?別の形式の素材と優れたワークフローを既に持っているのでお願いしますが、Notebookのインタラクティブな環境を活用したいと思います。
考えられる解決策:ノートは、.py
ファイル、およびドキュメントには、nbconvert
がノートブックをpythonスクリプトとしてエクスポートするとき、ノートブックを再作成するために使用できるコメントにディレクティブを埋め込みます。このメソッドの制限について 免責事項 が付属しており、受け入れられる形式は私が見つけることができるどこにも文書化されていません(奇妙なことに、ノートブックの説明セクションにサンプルが表示されます JSON format )。誰でもより多くの情報を提供できますか?
編集(2016年3月1日):何らかの理由でこの入力形式はノートブックAPIのバージョン4でサポートされていないため、受け入れられた回答は機能しなくなりました。 a-self-answerを追加しました。現在の(v4)APIでノートブックをインポートする方法を示しています。 (現時点での問題を解決し、自己回答で使用したリソースを指摘してくれたため、現在の回答を受け入れていません。)
以下は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.startswith
のPyReader.to_notebook
ステートメントを参照してください。
受け入れられた回答のコードはもう機能しないため、現在の(_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>
_セルを追加することです。バグによって削除され、誰もが満足します。 text
をv3.reads_py()
に渡す前に、以下を実行してください。
_text += """
# <markdowncell>
# If you can read this, reads_py() is no longer broken!
"""
_
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()
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)
保証はありませんが、うまくいきました
P.Toccateliとalexisのコードを取得および変更して、セルマーカーのようなpycharmとspyderでも動作するように自由を取り、それを github でリリースしました。
役立つかもしれないvscodeの拡張機能を作成しました。 pythonファイルをipythonノートブックに変換します。エラーが発生した場合は、問題を送信してください。
私は手遅れではないことを願っています。
Python PyPIでp2jと呼ばれるパッケージを公開しました。このパッケージはJupyterノートブック.ipynb
を作成します。 a Pythonソースコード.py
。
pip install p2j
p2j script.py
.py
ファイルから生成されたJupyterノートブックの例:
https://github.com/sklam/py2nb からスクリプトpy2nbを使用できます。
* .pyには特定の構文を使用する必要がありますが、使用するのはかなり簡単です(「samples」フォルダーの例を見てください)