2013-07-31 27 views

Odpowiedz

4

Jest, można zrobić:

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') 

Ale to nie jest tak mądry i będzie umieścić cały kod z pliku Pythona w jednej komórce Notebook ipython. Ale zawsze możesz zrobić trochę parsowania.

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: Wyjaśniając analizowania

w poprzednim kodzie podział komórek jest wyzwalany, gdy pusta linia pojawia się przed instrukcją poziomie modułu (funkcja, zmienna lub klasy definicji, import, etc .). Jest tak, gdy widzę linię, która nie jest wcięta i poprzedzona jest pustą linią). Więc:

import time 
import datetime 

będzie tylko jedna komórka, ale:

import time 

import datetime 

będą dwie komórki, a także

class Test(objet): 

    def __init__(self, x): 

     self.x = x 

    def show(self): 

     print(self.x) 

class Foo(object): 
    pass 

będą dwie komórki, ponieważ istnieją tylko dwie definicje top level (linie, które nie są wcięte) poprzedzone pustym wierszem (pierwszy wiersz w pliku jest uważany za poprzedzony pustą linią, ponieważ musi uruchomić nową komórkę).

+0

To jest przydatne. Czy możesz dodać w odpowiedzi krótką informację o uruchomieniu podziału komórki? – user2304916

+0

Dodano proste wyjaśnienie. –

+0

Nie zamierzam konwertować pliku Pythona do notebooka, ale raczej napisać serię notatników za pomocą skryptu Pythona. IPython.nbformat.current wygląda tak, jakbym był po. dzięki! – alex

Powiązane problemy