Làm cách nào để chuyển đổi IPython Notebook thành tệp Python thông qua dòng lệnh?


258

Tôi đang xem xét sử dụng các tệp * .ipynb làm nguồn của sự thật và lập trình 'biên dịch' chúng thành các tệp .py cho các công việc / tác vụ theo lịch trình.

Cách duy nhất tôi hiểu để làm điều này là thông qua GUI. Có cách nào để làm điều đó thông qua dòng lệnh?


1
"Nguồn sự thật" nghĩa là gì? Máy tính xách tay IPython chỉ là tập tin json. Bạn có thể tải chúng và thao tác như từ điển Python. Đối với mã nguồn, bạn nên lặp lại inputcác khóa trong đó cell_typebằng 'mã'. Hãy xem sơ đồ này
theta

1
Tôi muốn lưu trữ .ipynb trong một kho lưu trữ chứ không phải các tệp .py. Vì vậy, với tư cách là 'bước xây dựng', tôi sẽ chuyển đổi các tệp .ipynb thành .py để sử dụng thực tế bởi hệ thống tự động. Bạn nói đúng, tôi chỉ có thể tải json và chỉ xuất ra các ô mã, nhưng tôi tự hỏi liệu có cái gì đó đã làm điều đó cho tôi không :)
Stefan Krawc:

1
@StefanKrawchot Bạn có thể vui lòng đánh dấu một cái gạt như được chấp nhận không? Tôi muốn giới thiệu wwwilliam's asnwer
pedram bashiri

Câu trả lời:


413

Nếu bạn không muốn xuất tập lệnh Python mỗi lần lưu hoặc bạn không muốn khởi động lại kernel IPython:

Trên dòng lệnh , bạn có thể sử dụng nbconvert:

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

Là một chút của hack, bạn thậm chí có thể gọi lệnh trên trong sổ ghi chép IPython bằng cách chờ xử lý trước !(được sử dụng cho bất kỳ đối số dòng lệnh nào). Bên trong một cuốn sổ:

!jupyter nbconvert --to script config_template.ipynb

Trước khi --to scriptđược thêm vào , tùy chọn là --to pythonhoặc --to=python, nhưng nó đã được đổi tên trong khi chuyển sang hệ thống sổ ghi chép không biết ngôn ngữ.


8
Nếu bạn muốn mỗi lần lưu, jupyterbạn có thể kích hoạt nbconvertthông qua các móc trước hoặc sau lưu: ContentsManager.pre_save_hookabd FileContentsManager.post_save_hook. Bạn sẽ thêm một cái móc sau lưujupyter nbconvert --to script [notebook]
jaimedash

3
Có cách nào để làm ngược lại tức là chuyển đổi từ tập lệnh python sang notebook. Đối với ex - có một số tài liệu chuyên ngành được phân tích cú pháp vào các ô?
Sujen Shah

3
chuyển đổi tất cả các máy tính xách tay trong một thư mụcjupyter nbconvert --to script /path/to/notebooks/*.ipynb
openwonk

8
Cảm ơn, nó hoạt động!, Nhưng nếu tôi không muốn # In[ ]:loại nội dung trong tập lệnh thì tôi muốn nó sạch sẽ. Có cách nào để làm điều đó?
Rishabh Agrahari

1
@RishabhAgrahari kiểm tra tại đây, bạn chỉ có thể tùy chỉnh kẻ nói dối jupyter-notebook.readthedocs.io/en/urdy/extending/ Lỗi
MichaelChirico

77

Nếu bạn muốn chuyển đổi tất cả *.ipynbcác tệp từ thư mục hiện tại sang tập lệnh python, bạn có thể chạy lệnh như thế này:

jupyter nbconvert --to script *.ipynb

19

Dưới đây là một cách nhanh chóng và bẩn để trích xuất mã từ ipynb V3 hoặc V4 mà không cần sử dụng ipython. Nó không kiểm tra các loại tế bào, vv

import sys,json

f = open(sys.argv[1], 'r') #input.ipynb
j = json.load(f)
of = open(sys.argv[2], 'w') #output.py
if j["nbformat"] >=4:
        for i,cell in enumerate(j["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["source"]:
                        of.write(line)
                of.write('\n\n')
else:
        for i,cell in enumerate(j["worksheets"][0]["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["input"]:
                        of.write(line)
                of.write('\n\n')

of.close()

1
Câu trả lời tốt nhất nếu bạn không muốn cài đặt bất kỳ công cụ Jupyter nào.
dacracot

1
Tôi thích điều này. Nhưng tôi phát hiện ra khi tôi tải xuống định dạng .py từ máy tính xách tay Jupyter, nó sử dụng các kết thúc dòng UNIX ngay cả khi tôi đang ở trên windows. Để tạo tương tự, thêm newlines='\n'đối số thứ ba trong lệnh gọi tệp đầu ra mở. (Python 3.x)
RufusVS

16

Theo ví dụ trước nhưng với phiên bản lib nbformat mới :

import nbformat
from nbconvert import PythonExporter

def convertNotebook(notebookPath, modulePath):

  with open(notebookPath) as fh:
    nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)

  exporter = PythonExporter()
  source, meta = exporter.from_notebook_node(nb)

  with open(modulePath, 'w+') as fh:
    fh.writelines(source.encode('utf-8'))

Dòng mã cuối cùng, fh.writelines (source.encode ('utf-8')) đưa ra đối số 'TypeError: write () phải là str, chứ không phải int' fh.writelines (nguồn) hoạt động.
BarryC

6

Bạn có thể làm điều này từ API IPython.

from IPython.nbformat import current as nbformat
from IPython.nbconvert import PythonExporter

filepath = 'path/to/my_notebook.ipynb'
export_path = 'path/to/my_notebook.py'

with open(filepath) as fh:
    nb = nbformat.reads_json(fh.read())

exporter = PythonExporter()

# source is a tuple of python source code
# meta contains metadata
source, meta = exporter.from_notebook_node(nb)

with open(export_path, 'w+') as fh:
    fh.writelines(source)

4

Jupytext thật tuyệt khi có trong chuỗi công cụ của bạn cho các chuyển đổi như vậy. Nó không chỉ cho phép chuyển đổi từ sổ ghi chép sang tập lệnh mà còn có thể quay lại từ tập lệnh sang sổ ghi chép. Và thậm chí có máy tính xách tay được sản xuất ở dạng thực thi.

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it 

Rõ ràng cũng có ipynb-py-convert, xem tại đây .
Wayne

'jupytext' không được công nhận là lệnh nội bộ hoặc bên ngoài, chương trình có thể hoạt động hoặc tệp bó. ???
Amine Chadi

Bạn đã cài đặt nó @AmineChadi. Xem ở đây để làm thế nào để làm điều đó. Nếu bạn đang sử dụng nó thông qua một máy tính xách tay làm giao diện dòng lệnh của bạn, bạn chỉ có thể chạy %pip install jupytexttrong sổ ghi chép của mình.
Wayne

3

Để chuyển đổi tất cả các tệp định dạng * .ipynb trong thư mục hiện tại sang tập lệnh python theo cách đệ quy:

for i in *.ipynb **/*.ipynb; do 
    echo "$i"
    jupyter nbconvert  "$i" "$i"
done

3
Tôi đã phải thêm --to scriptđối số để tránh đầu ra HTML mặc định trong Sao Mộc 4.4.0.
trojjer

0

Tôi đã có vấn đề này và cố gắng tìm giải pháp trực tuyến. Mặc dù tôi đã tìm thấy một số giải pháp, chúng vẫn có một số vấn đề, ví dụ, việc Untitled.txttạo tự động gây phiền nhiễu khi bạn khởi động một máy tính xách tay mới từ bảng điều khiển.

Vì vậy, cuối cùng tôi đã viết giải pháp của riêng mình :

import io
import os
import re
from nbconvert.exporters.script import ScriptExporter
from notebook.utils import to_api_path


def script_post_save(model, os_path, contents_manager, **kwargs):
    """Save a copy of notebook to the corresponding language source script.

    For example, when you save a `foo.ipynb` file, a corresponding `foo.py`
    python script will also be saved in the same directory.

    However, existing config files I found online (including the one written in
    the official documentation), will also create an `Untitile.txt` file when
    you create a new notebook, even if you have not pressed the "save" button.
    This is annoying because we usually will rename the notebook with a more
    meaningful name later, and now we have to rename the generated script file,
    too!

    Therefore we make a change here to filter out the newly created notebooks
    by checking their names. For a notebook which has not been given a name,
    i.e., its name is `Untitled.*`, the corresponding source script will not be
    saved. Note that the behavior also applies even if you manually save an
    "Untitled" notebook. The rationale is that we usually do not want to save
    scripts with the useless "Untitled" names.
    """
    # only process for notebooks
    if model["type"] != "notebook":
        return

    script_exporter = ScriptExporter(parent=contents_manager)
    base, __ = os.path.splitext(os_path)

    # do nothing if the notebook name ends with `Untitled[0-9]*`
    regex = re.compile(r"Untitled[0-9]*$")
    if regex.search(base):
        return

    script, resources = script_exporter.from_filename(os_path)
    script_fname = base + resources.get('output_extension', '.txt')

    log = contents_manager.log
    log.info("Saving script at /%s",
             to_api_path(script_fname, contents_manager.root_dir))

    with io.open(script_fname, "w", encoding="utf-8") as f:
        f.write(script)

c.FileContentsManager.post_save_hook = script_post_save

Để sử dụng tập lệnh này, bạn có thể thêm nó vào ~/.jupyter/jupyter_notebook_config.py:)

Lưu ý rằng bạn có thể cần phải khởi động lại máy tính xách tay / phòng thí nghiệm jupyter để nó hoạt động.


0

Có một gói rất hay gọi là nb_dev , được thiết kế để soạn thảo các gói Python trong Notebook Jupyter. Giống như nbconvert,nó có thể biến một máy tính xách tay thành một tệp .py, nhưng nó linh hoạt và mạnh mẽ hơn vì nó có rất nhiều tính năng bổ sung tốt để giúp bạn phát triển các bài kiểm tra, tài liệu và đăng ký các gói trên PyPI. Nó được phát triển bởi những người nhanh chóng.

Nó có một chút của một đường cong học tập, nhưng tài liệu là tốt và nó không phải là khó khăn tổng thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.