27

ipythonノートブックをブログ投稿、pdf、または本全体(〜min 43)に変換する方法について、iPython開発者によるいくつかの講演を見てきました 。PDF-to-Xコンバーターは、マークダウンまたはコードで記述されたiPythonセルを解釈し、新しくフォーマットされたドキュメントを1つのステップで吐き出します。

私の問題は、図やセクションの多くがプログラムで生成された大きなドキュメントを生成したいということです-このようなものです。上記のメソッドを使用してiPythonでこれを機能させるには、他のiPython-Code-Blocksを書き込む関数を記述できる必要があります。この機能は存在しますか?

#some pseudocode to give an idea
for variable in list:
    image = make_image(variable)
    write_iPython_Markdown_Cell(variable)
    write_iPython_Image_cell(image)

これは役に立つかもしれないと思うので、私は疑問に思っています:

  1. iPythonを介してiPythonセルを生成することが可能です
  2. これが悪い考えであり、テンプレートライブラリ(Jinja)のような「古典的な」ソリューションに固執する必要がある場合。

ありがとう、zach cp

編集:Thomasの提案に従って、私はipythonメーリングリストに投稿し、このアイデアの実現可能性についていくつかのフィードバックを得ました。要するに、このアイデアを元のアイデアにとって理想的とは言えないものにするいくつかの技術的な問題があります。マークダウンセルと対応する画像/テーブルを生成したい反復レポートの場合、Jinjaのようなテンプレートシステムで直接レポートを生成するよりも、ipythonカーネル/ブラウザーを介して作業するのは非常に複雑です。

4

10 に答える 10

24

ここに、プログラムで新しいセルを作成する方法を示す、FernandoPerezによるノートブックの要点があります。メタデータを渡すこともできるので、レポートを生成していてノートブックをスライドショーに変えたい場合は、セルをスライド、サブスライド、フラグメントなどにするかどうかを簡単に指定できます。

あらゆる種類のセルを追加できるので、必要なものは今では簡単です(ただし、質問が行われたときはおそらくそうではありませんでした!)。たとえば、次のようなもの(テストされていないコード)が機能するはずです:

from IPython.nbformat import current as nbf

nb = nbf.new_notebook()

cells = []

for var in my_list:
    # Assume make_image() saves an image to file and returns the filename
    image_file = make_image(var)
    text = "Variable: %s\n![image](%s)" % (var, image_file)
    cell = nbf.new_text_cell('markdown', text)
    cells.append(cell)

nb['worksheets'].append(nbf.new_worksheet(cells=cells))

with open('my_notebook.ipynb', 'w') as f:
        nbf.write(nb, f, 'ipynb')
于 2014-05-19T04:14:07.017 に答える
17

それが良いアイデアかどうかは判断しませんがget_ipython().set_next_input(s)、ノートブックを呼び出すと、文字列を使用して新しいセルが作成されますs。これは、IPythonがそのコマンド%loadに内部的に使用するものです。%recall

于 2012-11-29T17:39:24.547 に答える
8

Talが受け入れた回答は少し非推奨になり、さらに非推奨になっていることに注意してください。ipythonv3nbformatでは、直接インポートでき(/すべき)、その後、作成するノートブックのバージョンを指定する必要があります。

それで、

from IPython.nbformat import current as nbf

になります

from nbformat import current as nbf

になります

from nbformat import v4 as nbf

ただしwrite、この最終バージョンでは、メソッドが親モジュールnbformatにあり、Fernando Perezが使用する他のすべてのメソッドがモジュールにあるため、互換性が失われv4ますが、一部のメソッドは異なる名前になっています(たとえば、new_text_cell('markdown', source)になりますnew_markdown_cell(source))。

これは、v3の方法の例です。コードと出力についてはを参照generate_examples.pyplotstyles.ipynbください。IPython 4は、執筆時点では非常に新しいため、Webインターフェイスを使用して[新しいノートブック]をクリックしても、v3ノートブックが生成されます。

于 2015-11-05T19:40:32.477 に答える
3

以下は、ファイルの内容をロードしてノートブックの次のセルに挿入する関数のコードです。

from IPython.display import display_javascript

def make_cell(s):
   text = s.replace('\n','\\n').replace("\"", "\\\"").replace("'", "\\'")
   text2 = """var t_cell = IPython.notebook.get_selected_cell()
   t_cell.set_text('{}');
   var t_index = IPython.notebook.get_cells().indexOf(t_cell);
   IPython.notebook.to_code(t_index);
   IPython.notebook.get_cell(t_index).render();""".format(text)
   display_javascript(text2, raw=True)

def insert_file(filename):
   with open(filename, 'r') as content_file:
       content = content_file.read()
   make_cell(content)

詳細は私のブログをご覧ください。

于 2018-03-30T09:03:23.437 に答える
2

魔法を使うことは別の解決策かもしれません。例えば

get_ipython().run_cell_magic(u'HTML', u'', u'<font color=red>heffffo</font>')

セル内にプログラムでHTMLを生成できるようになったので、必要に応じて任意の方法でフォーマットできます。もちろん画像もサポートされています。複数のセルへの出力を繰り返し生成する場合は、プレースホルダーとなる文字列を使用して上記の複数を実行します。

ps私はかつてこの必要性があり、このスレッドに到達しました。そのとき、テーブル(リストとタプルのASCII出力ではない)をレンダリングしたかったのです。後で私pandas.DataFrameは自分の仕事に驚くほど適していることに気づきました。HTML形式のテーブルを自動的に生成します。

于 2013-09-12T11:43:19.100 に答える
1
from IPython.display import display, Javascript

def add_cell(text,  type='code', direct='above'):
    text = text.replace('\n','\\n').replace("\"", "\\\"").replace("'", "\\'")
    display(Javascript('''
        var cell = IPython.notebook.insert_cell_{}("{}")
        cell.set_text("{}")
        '''.format(direct, type, text)));

for i in range(3):
    add_cell(f'# heading{i}', 'markdown')
    add_cell(f'code {i}')

上記のコードは次のようにセルを追加します: ここに画像の説明を入力してください

于 2021-10-28T08:53:13.240 に答える
0

Jupyterノートブックで実行します。

!pip install p2j

次に、コマンドラインを使用して、ファイルが配置されている対応するディレクトリに移動し、次のコマンドを実行します。

python p2j <myfile.py> -t <myfile.ipynb> 
于 2020-04-15T20:49:34.363 に答える
0

コマンドラインを使用して、myfile.pyファイルが配置されているディレクトリに移動して実行します(例):C:\ MyDir \ pip install p2j

次に、次を実行します。C:\ MyDir \ p2j myfile.py -t myfile.ipynb

于 2020-04-15T20:53:35.227 に答える
0

上記のTalの回答Chris Barnesからの更新、およびnbformatドキュメントの少しの掘り下げを組み込んだわずかな更新として、次のことがうまくいきました。

import nbformat
from nbformat import v4 as nbf

nb = nbf.new_notebook()

cells = [
    nbf.new_code_cell(f"""print("Doing the thing: {i}")""")
    for i in range(10)
]

nb.cells.extend(cells)

with open('generated_notebook.ipynb', 'w') as f:
    nbformat.write(nb, f)

その後、新しい人工ノートブックを起動して、必要な場所でセルをカットアンドペーストできます。

これが何かをするための最良の方法である可能性は低いですが、汚いハックとしては役に立ちます。‍ </ p>

これは、次のバージョンで機能しました。

Package              Version
-------------------- ----------
ipykernel            5.3.0
ipython              7.15.0
jupyter              1.0.0
jupyter-client       6.1.3
jupyter-console      6.1.0
jupyter-core         4.6.3
nbconvert            5.6.1
nbformat             5.0.7
notebook             6.0.3
...
于 2020-06-17T19:25:48.873 に答える
0

@xingpei Pangソリューションは、特に、たとえば複数のグループを持つデータセットごとにカスタマイズされたコードを作成する場合に最適です。ただし、javascriptコードの主な問題は、信頼できるノートブックでこのコードを実行すると、ノートブックがロードされるたびに実行されることです。

私が思いついた解決策は、実行後にセル出力をクリアすることです。javascriptコードは出力セルに保存されるため、出力をクリアすることにより、コードはなくなり、信頼できるモードで再度実行するために何も残されません。ここからのコードを使用することで、解決策は以下のコードになります。

from IPython.display import display, Javascript, clear_output

def add_cell(text,  type='code', direct='above'):
    text = text.replace('\n','\\n').replace("\"", "\\\"").replace("'", "\\'")
    display(Javascript('''
        var cell = IPython.notebook.insert_cell_{}("{}")
        cell.set_text("{}")
        '''.format(direct, type, text)));

# create cells
for i in range(3):
    add_cell(f'# heading{i}', 'markdown')
    add_cell(f'code {i}')
    

# clean the javascript code from the current cell output
for i in range(10):
    clear_output(wait=True)

clear_output()出力がクリアされていることを確認するために、を数回実行する必要があることに注意してください。

于 2021-11-22T08:53:17.073 に答える