2013-07-31 22 views
5

Bir python komut dosyasından birkaç not defteri oluşturmak istiyorum. IPython not defterleri yazmak için bir API var mı?IPython dizüstü api var mı?

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

Fakat o kadar zeki değil ve bir ipython Notebook hücreye piton dosyasından tüm kodu yerleştirecektir: Orada

cevap

4

, sen yapabilirsiniz. Ama her zaman biraz ayrıştırma yapabilirsin.

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

Düzenleme: Bir hücre bölünme boş bir satır, bir modül düzeyinde eğitim (işlev, değişken veya sınıf tanımı, ithalat, vs önce göründüğünde tetiklenir Önceki kodda ayrıştırılmasını

açıklanması .). Bu, girintisiz olan ve boş bir satırdan önce gelen bir çizgiyi gördüğüm zaman). Yani:

import time 
import datetime 

sadece bir hücre olabilir, ama Will:

import time 

import datetime 

iki hücreleri ve olacak da

class Test(objet): 

    def __init__(self, x): 

     self.x = x 

    def show(self): 

     print(self.x) 

class Foo(object): 
    pass 

sadece iki üst düzey tanımları olmadığından iki hücre olacak (boş olmayan satırlar) önce boş bir satır ile (dosyada ilk satırın önceliği boş bir satıra sahip olarak kabul edilir, çünkü yeni bir hücre başlatması gerekir).

+0

Bu yararlıdır. Bir hücre bölünmesi tetiklendiğinde, cevabı kısa bir beyanda ekleyebilir misiniz? – user2304916

+0

Basit bir açıklama ekledi. –

+0

Bir python dosyasını bir dizüstü bilgisayara dönüştürmeyi değil, bir python betiği kullanarak bir dizi not defteri yazmayı düşünmüyorum. IPython.nbformat.current, neyin peşinde olduğum gibi görünüyor. Teşekkürler! – alex

İlgili konular