2015-11-03 11 views
21

markdownpythonのセルが混在したipythonノートブックがあります。ipythonノートブックでセルの内容を読み取る

私のpythonのセルのいくつかは、隣接するセルmarkdownを読み込み、それらを入力として処理したいと思います。

所望の状況の例:

セル1(値下げ):SQLコード

CELL 2(値下げ)実行する:select * from tbl where x=1

セル3(Python)mysql.query(ipython.previous_cell.content)

" CELL 3" を実行

(構文ipython.previous_cell.contentが作られる)

mysql.query("select * from tbl where x=1")

に相当する必要がありますどのようにこれを行うことができますか?

+1

「これはできますか?」と尋ねることから始めます。私はこれが明らかだとは思わない。 – cel

+0

ある意味では、私たちはいつも '.ipynb'フォーマットを自分自身で解釈して解釈し、セルの内容を読むことができます –

+1

これで何を達成しようとしていますか? –

答えて

13

私はあなたが間違った方法で問題を攻撃しようとしていると思います。

まず、ヘッドレスノートブックの実行ではうまくいかない、本当にハックのある方法で隣接するマークダウンセルを取得することができます。

あなたがしたいことは、セルが2パーセント記号で始まり識別子のあとで始まる限り任意の構文を許可するIPythonセルマジックを使用することです。

通常、SQLセルが必要です。

あなたはおよそcells magics または私はそれを構築する方法をお見せすることができますマニュアルを参照してくださいすることができます:今、あなたはあなたのpython細胞内でSQL構文を使用することができます

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) 

%%sql 
select * from foo Where QUX Bar 

秒セル:

%%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]) 

これは、あなたが実行することを要求しませんたとえば、_storeがの場合は__getattr__を上書きするクラスは、ドット構文のフィールドにアクセスする場合は__getitem__のように振る舞うように、正しいセルの順序で、前のセルを%%sqlという構文で使用することはできません。これは、応答の読者への課題、あるいはエンド見るように残っている:あなたは、あなたのPythonの細胞内

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

そしてようなSQLの細胞を使用することができます

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

mysql.execute(__mystore.A1) 

私はまた、Catherine Develin SqlMagicをIPythonに、そしてこのNotebook gistをGitHubに見ることを強くお勧めします。

pigを追加したいと思うコメントでは、%%pigの魔法も持っていないことを何も妨げていません。また、SQLとPIGの正しい構文強調表示を有効にするためにJavascriptを挿入することもできますが、それはこの質問の範囲を超えています。

+0

私はこの特定の解決法は必要ありませんが、これはIPythonの魔法に関する素晴らしい情報です。 – alexis

関連する問題