2015-11-03 72 views
21

我有一個ipython筆記本電腦與混合markdownpython單元格。閱讀ipython筆記本中的單元格內容

而且我希望我的一些python單元讀取相鄰的markdown單元格並將它們作爲輸入進行處理。

的期望的情況的一個例子:

CELL 1(降價):SQL代碼以執行

CELL 2(降價)select * from tbl where x=1

CELL 3(python)mysql.query(ipython.previous_cell.content)

(語法ipython.previous_cell.content由)

執行 「CELL 3」 應該是相當於mysql.query("select * from tbl where x=1")

如何才能做到這一點?

+1

我首先要問'可以這樣做嗎?'。我不認爲這是顯而易見的。 – cel

+0

可以這樣或那樣的方式,我們總是可以自己嘗試和解釋'.ipynb'格式,並閱讀單元格內容 –

+1

我可以問一下,你想用這個來實現什麼? –

回答

13

我認爲你試圖以錯誤的方式攻擊問題。

首先是的,它可能會讓相鄰的減價單元變得非常黑客,在無頭筆記本執行中不起作用。

你想要做的是使用IPython單元格魔術,只要單元格以2個百分號開頭,後面跟一個標識符,它就允許任意語法。

通常你想要SQL單元格。

您可以參考相關文檔有關cells magics 或者我可以告訴你如何建立一個:

from IPython.core.magic import (
    Magics, magics_class, cell_magic, line_magic 
) 

@magics_class 
class StoreSQL(Magics): 


    def __init__(self, shell=None, **kwargs): 
     super().__init__(shell=shell, **kwargs) 
     self._store = [] 
     # inject our store in user availlable namespace under __mystore 
     # name 
     shell.user_ns['__mystore'] = self._store 

    @cell_magic 
    def sql(self, line, cell): 
     """store the cell in the store""" 
     self._store.append(cell) 

    @line_magic 
    def showsql(self, line): 
     """show all recorded statements""" 
     print(self._store) 

    ## use ipython load_ext mechanisme here if distributed 
    get_ipython().register_magics(StoreSQL) 

現在你可以在你的Python細胞利用SQL語法:

%%sql 
select * from foo Where QUX Bar 

第二cell:

%%sql 
Insert Cheezburger into Can_I_HAZ 

檢查我們執行了什麼(3 dashe S顯示輸入/輸出劃界,你不必鍵入它們):

%showsql 
--- 
['select * from foo Where QUX Bar', 'Insert Cheezburger into Can_I_HAZ'] 

而你在你的問題問開頭:

mysql.query(__mystore[-1]) 

當然,這要求你執行先前的單元格按正確的順序排列,但沒有什麼能阻止您使用%%sql語法命名您的單元格,例如,如果_storedict或更好的類別,那麼您將覆蓋__getattr__,以便像__getitem__那樣操作以使用點語法來訪問字段。這是作爲練習留給讀者,或看看到底響應:

@cell_magic 
def sql(self, line, cell): 
    """store the cell in the store""" 
    self._store[line.strip()] = cell 

然後你可以使用SQL細胞像

%%sql A1 
set foo TO Bar where ID=9 

然後在你的Python細胞

mysql.execute(__mystore.A1) 

我也強烈建議在GitHub上看看Catherine Develin SqlMagic的IPython和這個Notebook gist,這些都顯示了這一切。

在評論中,你似乎想說要添加pig,沒有什麼能阻止你擁有魔法。也可以注入Javascript來啓用SQL和PIG的正確語法高亮顯示,但這超出了這個問題的範圍。

+0

我不需要這個特定的解決方案,但是這是關於IPython magics的很好的信息,謝謝! – alexis