Robin's Blog

How to: rescue lost code from a Jupyter/IPython notebook

Jupyter (formerly known as IPython) notebooks are great – but have you ever accidentally deleted a cell that contained a really important function that you want to keep? Well, this post might help you get it back.

So, imagine you have a notebook with the following code:

Screen Shot 2016-04-15 at 12.52.40
and then you accidentally delete the top cell, with the definition of your function…oops! Furthermore, you can’t find it in any of your ‘Checkpoints’ (look under the File menu). Luckily, your function is still defined…so you can still run it:

Screen Shot 2016-04-15 at 12.53.01

This is essential for what follows…because as the function is still defined, the Python interpreter still knows internally what the code is, and it gives us a way to get this out!

So, if you’re stuck and just want the way to fix it, then here it is:

def rescue_code(function):
    import inspect
    get_ipython().set_next_input("".join(inspect.getsourcelines(function)[0]))

Just call this as rescue_code(f), or whatever your function is, and a new cell should be created with the code of you function: problem solved! If you want to learn how it works then read on…

Screen Shot 2016-04-15 at 12.54.19

The code is actually very simple, inspect.getsourcelines(function) returns a tuple containing a list of lines of code for the function and the line of the source file that the code starts on (as we’re operating in a notebook this is always 1). We extract the 0th element of this tuple, then join the lines of code into one big string (the lines already have \n at the end of them, so we don’t have to deal with that. The only other bit is a bit of IPython magic to create a new cell below the current cell and set its contents….and that’s it!

I hope this is helpful to someone – I’m definitely going to keep this function in my toolkit.


Categorised as: How To, Programming, Python


10 Comments

  1. Jaime Lopez says:

    Hi Robin,

    Great tool, I will keep in my tool’s box. It is really important.
    I am wondering why Jupyter creators (Perez and company) do not create an UNDO function inside EDIT menu?
    Thanks, Jaime

  2. Robin Wilson says:

    There is an undo function in the notebook, but it doesn’t cover everything. When you’ve deleted a cell there is an ‘undo delete cell’ item in the Edit menu, but you can also undo changes to the text in cells by pressing Ctrl-Z (or Cmd-Z). I think (though I am not 100% sure) that there is a per-cell undo buffer: so you can undo changes in separate cells independently. That does, of course, mean that you have to click on the cell that you want to undo things in before you can actually undo anything.

    Hope that helps!

  3. Jaime Lopez says:

    Thanks Robin,

    Yeah, that help me.

    Have a good day, Jaime

  4. Alex says:

    god bless you

  5. Dzung Nguyen says:

    You’ve just saved my life 😀

  6. Hallu Liao says:

    Thanks, that’s really helpful.

  7. mxhf says:

    You’ve just saved my life as well!!!

  8. Luke says:

    Thank you- just saved me 2 days work!

  9. Robert Schnabel says:

    Thank you. Again! Thank you for saving me from myself..

  10. Harry Morris says:

    Fantastic, this helped me a lot!

Leave a Reply

Your email address will not be published. Required fields are marked *