¿Cómo cargar / editar / ejecutar / guardar archivos de texto (.py) en una celda portátil IPython?


232

Recientemente me mudé a usar notebooks IPython como parte de mi flujo de trabajo. Sin embargo, no he tenido éxito en encontrar una manera de importar archivos .py en las celdas individuales de un cuaderno abierto de IPython para que puedan editarse, ejecutarse y luego guardarse. Se puede hacer esto?

Encontré esto en la documentación que me dice cómo importar archivos .py como cuadernos nuevos, pero esto no alcanza lo que quiero lograr.

Cualquier sugerencia sería muy apreciada.


66
Buena pregunta. Todavía tengo que ver una respuesta realmente satisfactoria. Es especialmente importante cuando se sirve un portátil IPython a través de Internet. Si la gente quiere ver / editar el código fuente de las funciones que se importan (con resaltado de sintaxis, etc.), actualmente no hay una manera fácil de hacerlo. Debería ser posible abrir archivos py sin transformarlos en archivos ipynb.
Peter

Respuestas:


306

EDITAR : a partir de IPython 3 (ahora proyecto Jupyter), el portátil tiene un editor de texto que puede usarse como una alternativa más conveniente para cargar / editar / guardar archivos de texto.

Se puede cargar un archivo de texto en una celda del cuaderno con el comando mágico %load.

Si ejecuta una celda que contiene:

%load filename.py

el contenido de filename.pyse cargará en la siguiente celda. Puede editarlo y ejecutarlo como de costumbre.

Para guardar el contenido de la celda de nuevo en un archivo, agregue la magia %%writefile filename.pyde la celda al comienzo de la celda y ejecútela. Tenga en cuenta que si ya existe un archivo con el mismo nombre , se sobrescribirá en silencio .

Para ver la ayuda de cualquier comando mágico, agregue ?: like %load?o %%writefile?.

Para obtener ayuda general sobre las funciones mágicas, escriba "% magic". Para obtener una lista de las funciones mágicas disponibles, use% lsmagic. Para obtener una descripción de cualquiera de ellos, escriba% magic_name ?, por ejemplo, '% cd?'.

Ver también: Funciones mágicas de los documentos oficiales de IPython.


3
Esto, además, %save -fparece ser la forma de hacer lo que estaba buscando. ¡Gracias!
aaronsstack

2
save -fes una forma indirecta de guardar en un archivo y funcionará solo si ejecuta la celda primero y luego proporciona la referencia correcta. En general, es más fácil de usar %%writefileque escribe la celda actual en un archivo. Actualicé la respuesta para mencionar esto.
user2304916

44
El nuevo comando mágico es actualmente %loadpy(en lugar de %load).
AlQuemist

1
de acuerdo con ipython.org/ipython-doc/3/interactive/magics.html el uso %loadestá bien, de ahora en adelante: " %loadpy ( Alias ​​de %load ) - %loadpyha ganado cierta flexibilidad y ha eliminado el requisito de una .pyextensión. Por lo tanto, se ha cambiado el nombre simplemente a %load. Puedes mirar %loaddocstring para más información ".
michael

118

Para escribir / guardar

%%writefile myfile.py

  • escriba / guarde el contenido de la celda en myfile.py (use -apara agregar). Otro alias:%%file myfile.py

Correr

%run myfile.py

  • ejecuta myfile.py y genera resultados en la celda actual

Para cargar / importar

%load myfile.py

  • cargar "import" myfile.py en la celda actual

Para más magia y ayuda

%lsmagic

  • enumera todos los otros comandos mágicos de células geniales.

%COMMAND-NAME?

  • para obtener ayuda sobre cómo usar un determinado comando. es decir%run?

Nota

Además de los comandos mágicos de la celda, el cuaderno IPython (ahora cuaderno Jupyter) es tan genial que te permite usar cualquier comando de Unix directamente desde la celda (esto también es equivalente a usar el %%bashcomando mágico de la celda).

Para ejecutar un comando unix desde la celda, simplemente preceda su comando con !mark. por ejemplo:

  • !python --version mira tu versión de python
  • !python myfile.pyejecute myfile.py y los resultados de salida en la celda actual, al igual que %run(vea la diferencia entre !pythony %runen los comentarios a continuación).

Además, vea este nbviewer para obtener más explicaciones con ejemplos. Espero que esto ayude.


1
Gracias, uso Windows y probé! Dir, output, !dir Volume in drive D is Documentsetc ... ¡Así que no es solo bash sino también cmd!
Brian

1
@iamaziz Creo que quisiste decir !python --version(error tipográfico)
Alexandre

55
Aziz, esta es una excelente respuesta. Una pequeña nota: es muy diferente de usar %run myfile.pyen lugar de !python myfile.py. Si hace lo primero, se ejecutará utilizando el kernel de ipython, incluida la precarga configurada. Un pequeño problema, pero me encontré con un error hoy en el que marcó la diferencia para mí.
Tristan Reid

Si desea hacer el equivalente a lo %run myfile.pydescrito en esta respuesta al incluir comandos mágicos de celda IPython en su script, use %run myfile.ipy.
Wayne

8

Arrastre y suelte un archivo de Python en la tabla de cuadernos "home" de los portátiles Ipython, haga clic en cargar. Esto creará un nuevo cuaderno con solo una celda que contiene el contenido del archivo .py

De lo contrario, copie / pegue desde su editor favorito;)


1
Gracias por su respuesta, pero como mencioné en el cuerpo de mi publicación, estoy buscando evitar crear un nuevo cuaderno cada vez, pero mantener el script .py desde una celda de un cuaderno existente.
aaronsstack

Arreglame si me equivoco: ¿no vas a usar el cuaderno como editor de texto? (Quiero decir: cada modificación en la celda no cambiará el archivo .py). Por cierto, no tengo idea de una forma nativa de insertar un contenido .py en una celda, siempre copie / pegue mi código cuando sea necesario ... lo siento
Raphaël Braud

5

He encontrado satisfactorio usar ls y cd dentro del cuaderno de ipython para encontrar el archivo. Luego escriba cat your_file_name en la celda, y obtendrá el contenido del archivo, que luego puede pegar en la celda como código.


!cat "file.txt"
Enrique Pérez Herrero
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.