programar - Leer el contenido de la celda en un cuaderno ipython
manual de python en jupyter notebook (1)
Creo que estás tratando de atacar el problema de manera incorrecta.
Primero, sí, es posible obtener la celda de reducción de datos adyacente de una manera realmente imprecisa que no funcionaría en la ejecución de un portátil sin cabeza.
Lo que quiere hacer es usar la magia de celda IPython, que permite una sintaxis arbitraria siempre que la celda comience con signos de 2 por ciento seguidos de un identificador.
Típicamente quieres celdas SQL.
Puede consultar la documentación sobre celdas mágicas o puedo mostrarle cómo crear eso:
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)
Ahora puedes usar la sintaxis SQL en tus celdas de python:
%%sql
select * from foo Where QUX Bar
una segunda celda:
%%sql
Insert Cheezburger into Can_I_HAZ
verifique lo que ejecutamos (los 3 guiones muestran la delimitación de entrada / salida, no tiene que escribirlos):
%showsql
---
[''select * from foo Where QUX Bar'', ''Insert Cheezburger into Can_I_HAZ'']
Y lo que preguntaste al principio en tu pregunta:
mysql.query(__mystore[-1])
Por supuesto, esto requiere que ejecute las celdas anteriores en el orden correcto, nada le impide usar la sintaxis %%sql
para nombrar sus celdas, por ejemplo, si _store
es un dict
, o mejor una clase en la que sobrescribe __getattr__
, para actuar como __getitem__
para acceder a los campos con sintaxis de puntos. Esto se deja como un ejercicio para el lector, o fin de la respuesta:
@cell_magic
def sql(self, line, cell):
"""store the cell in the store"""
self._store[line.strip()] = cell
entonces puedes usar sql cell como
%%sql A1
set foo TO Bar where ID=9
Y luego en tus celdas de Python.
mysql.execute(__mystore.A1)
También sugeriría encarecidamente consultar a Catherine Develin SqlMagic para IPython , y este cuaderno en GitHub que muestra todo esto en vivo.
En el comentario que pareces decir que quieres agregar pig
, nada te impide tener un %%pig
magia de %%pig
. También es posible inyectar Javascript para habilitar el resaltado de sintaxis correcto de SQL y PIG, pero eso está fuera del alcance de esta pregunta.
Tengo un ipython
notas ipython
con celdas mezcladas de python
y markdown
.
Y me gustaría que algunas de mis celdas de python
lean las celdas de markdown
adyacentes y las procesen como entrada.
Un ejemplo de la situación deseada:
CELL 1 (markdown) : Código SQL para ejecutar
CELULA 2 (reducción) :
select * from tbl where x=1
CELL 3 (python) :
mysql.query(ipython.previous_cell.content)
(La sintaxis ipython.previous_cell.content
está compuesta)
La ejecución de " CELL 3 " debería ser equivalente a mysql.query("select * from tbl where x=1")
¿Cómo se puede hacer esto?