2013-07-31 23 views

risposta

4

V'è, si può fare:

import io 
from IPython.nbformat import current 

def convert(py_file, ipynb_file): 
    with io.open(py_file, 'r', encoding='utf-8') as f: 
     notebook = current.reads(f.read(), format='py') 
    with io.open(ipynb_file, 'w', encoding='utf-8') as f: 
     current.write(notebook, f, format='ipynb') 

convert('test.py', 'test.ipynb') 

Ma non è così intelligente e sarà mettere tutto il codice dal file di pitone in una cella Notebook IPython. Ma puoi sempre fare un po 'di analisi.

import io 
import re 
from IPython.nbformat import current 

def parse_into_cells(py_file): 
    with io.open(py_file, 'r', encoding='utf-8') as f: 
     data = f.readlines() 
    in_cell = True 
    cell = '' 
    for line in data: 
     if line.rstrip() == '': 
      # If a blank line occurs I'm out of the current cell 
      in_cell = False 
     elif re.match('^\s+', line): 
      # Indentation, so nope, I'm not out of the current cell 
      in_cell = True 
      cell += line 
     else: 
      # Code at the beginning of the line, so if I'm in a cell just 
      # append it, otherwise yield out the cell and start a new one 
      if in_cell: 
       cell += line 
      else: 
       yield cell.strip() 
       cell = line 
       in_cell = True 
    if cell != '': 
     yield cell.strip() 

def convert(py_file, ipynb_file): 
    # Create an empty notebook 
    notebook = current.reads('', format='py') 
    # Add all the parsed cells 
    notebook['worksheets'][0]['cells'] = list(map(current.new_code_cell, 
                parse_into_cells(py_file))) 
    # Save the notebook 
    with io.open(ipynb_file, 'w', encoding='utf-8') as f: 
     current.write(notebook, f, format='ipynb') 

convert('convert.py', 'convert.ipynb') 

Edit: Spiegando il parsing

Nel codice precedente una divisione cellulare si attiva ogni volta che viene visualizzata una riga vuota prima di un'istruzione di livello di modulo (funzione, definizione della variabile o classe, l'importazione, ecc .). Questo è ogni volta che vedo una linea che non è rientrata ed è preceduta da una riga vuota). Quindi:

import time 
import datetime 

sarà solo una cella, ma:

import time 

import datetime 

saranno due cellule, e anche

class Test(objet): 

    def __init__(self, x): 

     self.x = x 

    def show(self): 

     print(self.x) 

class Foo(object): 
    pass 

saranno due celle dato che ci sono solo due definizioni di primo livello (righe che non sono rientrate) precedute da una riga vuota (la prima riga del file è considerata preceduta da una riga vuota perché deve iniziare una nuova cella).

+0

Questo è utile. Puoi aggiungere alla risposta una breve descrizione quando viene attivata una divisione cellulare? – user2304916

+0

Aggiunta una spiegazione semplice. –

+0

Non ho intenzione di convertire un file python in un notebook, ma piuttosto di scrivere una serie di quaderni usando uno script python. il IPython.nbformat.current sembra quello che stavo cercando. Grazie! – alex

Problemi correlati