44

I wrote a juypter notebook that has been converted to .py somehow. I would like it back in the original format. Does anyone know how to do that?

There is a previous stack overflow question about this, but the solution doesn't work for me. Converting to (not from) ipython Notebook format

The below is an example of what the code looks like now. It is a lot of code so would take hours to copy and paste it manually.

Thanks for the help.

{
   "cell_type": "code",
   "execution_count": 581,
   "metadata": {},
   "outputs": [],
   "source": [
    "def add_trig_slope(data, size = 1, axis = 0, option = 0, random = False, lower_b = -1, upper_b = 2): \n",
    "    \n",
    "    # To make the gradual decline of the fuck you plot\n",
    "    ## sin, cos, tan, sigmoid, other activation functions?\n",
    "    # need to list the option in the doc string\n",
    "    \n",
    "    ## Add a random element\n",
    "    newdata = data.copy()\n",
    "    cols = list(newdata.columns)\n",
    "    funcs = [math.sin, math.cos, math.tan, expit]\n",
    "    func = funcs[option]\n",
    "    if axis == 0:\n",
    "        for col in cols:\n",
    "            newdata.loc[:, col] -= size * (func(cols.index(col)))\n",
    "            if random:\n",
    "                newdata.loc[:,col] -= np.random.uniform(lower_b,upper_b)\n",
    "\n",
    "    elif axis == 1:\n",
    "        for i, node in enumerate(newdata.index):\n",
    "            newdata.loc[node,:] -= size * (func(i))\n",
    "            if random:\n",
    "                newdata.loc[node,:] -= np.random.uniform(lower_b,upper_b)\n",
    "\n",
    "        \n",
    "    return newdata\n",
    "    \n",
    "    "
   ]

SherbertTheCat
  • 655
  • 2
  • 7
  • 9
  • 8
    This question seems misleading. As far as I can tell this file has not been "converted to .py", it is just a notebook file incorrectly saved with the `.py` extension. Just change the extension back to `.ipynb`. – Denziloe Dec 07 '21 at 00:09

8 Answers8

47

Use p2j to convert Python source code to Jupyter Notebook.

From the command line, run

-->pip install p2j

then go to the directory where your file is located. -->( for example-> cd downloads, if the file is in download directory)

then run

-->p2j myscript.py

This will create a myscript.ipynb file.

SCouto
  • 7,808
  • 5
  • 32
  • 49
Niraj Singh
  • 569
  • 4
  • 4
  • 1
    This is not at all efficieent. It has commented all the lines just after the first comment. – Sachin Oct 17 '21 at 05:33
  • Works pretty well : it converted all "main comments" (i.e. starting with '#' and no leading space) to MarkDown cells, and assigned each function definition to a dedicated cell. – Skippy le Grand Gourou Jan 26 '23 at 14:34
13

You really should consider using jupytext

Run conda install jupytext or pip install jupytext

Then do: jupytext --set-formats ipynb,py <file>.ipynb

This will create the .ipynb file and for an additional bonus keep it synchronized to the .py file:

jupytext --set-formats ipynb,py <file>.ipynb --sync

This will make sure jupyter keeps the two files in sync when saving from now on...

Last note: If you are a gui person, after running the installation command for jupytext, everything else can be done from the gui as well File-->jupytext-->pair Notebook with light Script: enter image description here

ntg
  • 12,950
  • 7
  • 74
  • 95
  • I really like what's described from here :) If only it can annotate the file :D Because I'm a Software Engineer building Data Sciences LOL I modularized and containerize everything :D I want to keep both Software and Data Engineers working in harmony :) each on their own world – Marcello DeSales Feb 04 '22 at 23:49
  • Depends what you mean by annotation... I think every cell will be annotated so that it can be reconstructed... E.g. for cell [3], it will be preceded by #[3] etc. – ntg Feb 21 '22 at 13:12
  • Is there a way to use this with Pycharm? – triplej Aug 02 '23 at 19:06
9

Just rename it changing the extension e.g. for linux/macos

mv <file>.py <file>.ipynb

or right-click rename for windows and type the full name with the extension

(Since it seems that the contents are .ipynb contents already)

Pani
  • 1,317
  • 1
  • 14
  • 20
  • 1
    Thank you so much! This works perfectly. I will accept the answer in 8 minutes when I can - thanks for answering the question so quickly. – SherbertTheCat Jun 22 '20 at 08:23
  • 4
    This method does not work for me. The error message when trying to open the jupyter file is as follows: `Unreadable Notebook: C:\Users\Wei-shan\Desktop\python notebooks\regression-trees\cart_weishan.ipynb NotJSONError('Notebook does not appear to be JSON: \'"""Implementation of the CART algorithm...')` – Wei Shan Lee Jun 01 '21 at 11:32
  • 25
    The method in the answer only works if you have a notebook that is saved as .py (which is what the question was about), not as a general conversion mechanism from .py to .ipynb – Pani Jun 01 '21 at 22:26
6

ipynb-py-convert

By following below steps you can get .ipynb file

Install "pip install ipynb-py-convert" Go to the directory where the py file is saved via command prompt Enter the command

ipynb-py-convert YourFileName.py YourFilename.ipynb

Eg:. ipynb-py-convert getting-started-with-kaggle-titanic-problem.py getting-started-with-kaggle-titanic-problem.ipynb

Above command will create a python script with the name "YourFileName.ipynb" and as per our example it will create getting-started-with-kaggle-titanic-problem.ipynb file

2

Renaming won't work if the py fils were py from the beginning. The easiest way might be to run the following script from PowerShell:

  1. Install ipynb-py-convert:

    pip install ipynb-py-convert

  2. jump to your directory level

    cd "YOUR_DIRECTORY_PATH"

  3. Convert all files recursively (also in all subdirectories):

    foreach ($f in Get-ChildItem "." -Filter *.py -Recurse){ ipynb-py-convert $f.FullName "$($f.FullName.Substring(0,$f.FullName.Length-3)).ipynb"}

Cheers!

YazanGhafir
  • 464
  • 3
  • 8
1

Install jupytext package (# pip install jupytext)

import jupytext
notebook = jupytext.read('example.py')
jupytext.write(notebook, 'example.ipynb', fmt='.ipynb')
Tarun
  • 11
  • 1
0

If you wish to apply the conversion of all the .py files rooted in your project directory , you can run the following command in batch file:

for /r %%v in (*.py) do p2j "%%v" 
DBM
  • 71
  • 7
-1
jupytext --to notebook <name_of_script_file>.py
Andrey
  • 1,528
  • 14
  • 12