2012-11-28 44 views
14

我已經看到iPython開發人員就如何將ipython筆記本轉換爲a blog post, a pdf或甚至轉換爲entire book(〜分鐘43)進行了一些討論。 PDF-to-X converter解釋用markdown或代碼編寫的iPython單元,並在一個步驟中吐出新格式化的文檔。以編程方式將單元格添加到ipython筆記本以生成報表

我的問題是,我想生成一個大的文檔,其中許多數字和部分是以編程方式生成的 - 例如this。爲了使用上面的方法在iPython中工作,我需要能夠編寫一個可以編寫其他iPython代碼塊的函數。這種能力是否存在?

#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)這樣的「經典」解決方案。

感謝, 扎克CP

編輯:每托馬斯的建議, 正如我貼在ipython mailing list,並來到了這個想法的可行性一些反饋。總之 - 有一些技術上的困難使得這個想法對於最初的想法不太理想。對於想要生成降價單元格和相應圖像/表格的重複性報告,通過ipython內核/瀏覽器工作比直接使用Jinja等模板系統生成報告要複雜得多。

回答

10

Fernando Perez here有一個筆記本要點說明如何以編程方式創建新的單元格。請注意,您也可以傳入元數據,因此如果您要生成報告並希望將筆記本變成幻燈片,則可以輕鬆指示該單元格是否應該是幻燈片,子幻燈片,片段等。

你可以添加任何類型的單元格,所以你現在想要的是直截了當的(儘管它可能不是當問題提出時!)。例如。,像這樣(未測試的代碼)應該工作:

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') 
6

我不會判斷這是不是一個好主意,但如果您在筆記本中調用get_ipython().set_next_input(s),它將創建一個字符串爲s的新單元。這是IPython內部使用的%load%recall命令。

+0

謝謝托馬斯。如果這是我需要在別處尋找的唯一功能。它可以添加文本而不是圖像(它們不會被渲染)。它也會導致與期望的順序相反,因爲它總是從下一行的頂部加起來,從而推低其他行。因此,模板引擎可能會是一條好路徑,儘管它有一個很好的方法來創建一個一個文件的方法(如果它很簡單)。 – zach

+0

沒有真正的'圖像單元',但是您可以將圖像顯示爲代碼的輸出。到多於一個的顯示更多的,請參閱'Image'類和'在[IPython.core.display] display'函數(https://github.com/ipython/ipython/blob/master/IPython/core/display.py) 。我認爲還沒有辦法添加一個Markdown單元,但如果您將它添加到郵件列表中,可能會有興趣添加一個。 –

+0

你是對的我可以這樣做:x = Image(filename ='test.png'); get_ipython()。set_next_input(display_png(x))顯示圖像,但是我不能在這些圖像之間放置文本。也必須有一種方法來隱藏原始細胞。所以也許這有點複雜,但我會按照你的建議發佈到郵件列表。謝謝。 – zach

2

使用魔法可以是另一種解決方案。例如現在

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

,你可以通過編程的細胞生成HTML,你可以在任何方面,你想格式化。圖像當然是支持的。如果要重複生成輸出到多個單元格,只需執行上述多個操作,並將字符串作爲佔位符。

p.s.我曾經有這樣的需求,並且已經到達這個線程。我想渲染一個表(不是列表和元組的ascii輸出)。後來我發現pandas.DataFrame非常適合我的工作。它自動生成HTML格式的表格。

1

注意,由塔爾接受的答案是有點過時,而且越來越棄用:在IPython的V3,你可以(/應)直接導入nbformat,之後您需要指定要創建的筆記本版本。

所以,

from IPython.nbformat import current as nbf

成爲

from nbformat import current as nbf

成爲

from nbformat import v4 as nbf

然而,在該最終版本,兼容性打破,因爲write方法是父模塊nbformat,其中所有的由費爾南多佩雷斯使用的其它方法是本v4模塊中,儘管它們中的一些在不同的名稱(例如new_text_cell('markdown', source)變成new_markdown_cell(source))。

Here是v3處事方式的一個示例:請參閱generate_examples.py的代碼和plotstyles.ipynb的輸出。在撰寫本文時,IPython 4非常新,使用Web界面並點擊「新筆記本」仍然會生成v3筆記本。

1

當您想要運行單元格時,可以使用Shift + Enter鍵代替Ctrl + Enter。

Shift + Enter會自動生成一個新的單元格。

相關問題