Как преобразовать записную книжку IPython в файл Python с помощью командной строки?

Я хочу использовать файлы * .ipynb как источник правды и программно «компилировать» их в файлы .py для запланированных заданий / задач.

Насколько я понимаю, это можно сделать только через графический интерфейс. Есть ли способ сделать это через командную строку?


person Stefan Krawczyk    schedule 13.06.2013    source источник
comment
Что вы имеете в виду под источником истины? Блокноты IPython - это просто файлы json. Вы можете загружать их и использовать как словари Python. Для исходного кода вы должны повторять input ключи, где cell_type равно «коду». Взгляните на эту схему   -  person theta    schedule 13.06.2013
comment
Ну, я хочу хранить .ipynb в репозитории, а не файлы .py. Итак, в качестве «шага сборки» я бы преобразовал файлы .ipynb в .py для фактического использования автоматизированной системой. Вы правы, я мог бы просто загрузить json и вывести только ячейки кода, но мне было интересно, есть ли что-то, что уже сделало это для меня :)   -  person Stefan Krawczyk    schedule 13.06.2013
comment
@StefanKrawczyk Не могли бы вы отметить ответ как принятый? Я бы порекомендовал wwwilliam asnwer   -  person pedram bashiri    schedule 14.01.2020


Ответы (13)


Если вы не хотите выводить скрипт Python каждый раз при сохранении или не хотите перезапускать ядро ​​IPython:

В командной строке вы можете использовать nbconvert:

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

В качестве небольшого взлома вы даже можете вызвать указанную выше команду в записной книжке IPython, предварительно отложив ! (используется для любого аргумента командной строки). Внутри записной книжки:

!jupyter nbconvert --to script config_template.ipynb

До того, как --to script был добавлен, параметр был --to python или --to=python, но был переименовано в связи с переходом к системе блокнотов, не зависящей от языка.

person wwwilliam    schedule 04.11.2013
comment
Если вам нужно одно при каждом сохранении, в jupyter вы можете запускать nbconvert с помощью хуков до или после сохранения: ContentsManager.pre_save_hook abd FileContentsManager.post_save_hook. Вы бы добавили хук после сохранения jupyter nbconvert --to script [notebook] - person jaimedash; 03.05.2016
comment
Есть ли способ сделать обратное, т.е. преобразовать скрипт Python в записную книжку. Например, наличие некоторых специализированных строк документации, которые разбираются на ячейки? - person Sujen Shah; 17.01.2017
comment
конвертировать все записные книжки в папку jupyter nbconvert --to script /path/to/notebooks/*.ipynb - person openwonk; 22.07.2017
comment
Кто-нибудь знает, как предоставить параметры TemplateExporter для nbconvert? Я использую !jupyter nbconvert --to python 'jupi_demo.ipynb' --stdout --TemplateExporter.exclude_markdown=True на Jupyter 4.1.0, но он жалуется Config option exclude_markdown not recognized by PythonExporter. - person Some Noob Student; 20.09.2017
comment
Спасибо, это работает !, но что, если я не хочу, чтобы в скрипте использовался тип # In[ ]:, я хочу, чтобы он был чистым. Есть ли способ сделать это? - person Rishabh Agrahari; 31.01.2018
comment
@RishabhAgrahari ты нашел способ для этого? - person matanster; 07.08.2018
comment
@RishabhAgrahari, проверьте здесь, вы можете просто настроить линтер jupyter-notebook. readthedocs.io/en/stable/exnding/ - person MichaelChirico; 12.09.2018
comment
@RishabhAgrahari Следующее, кажется, работает для меня. !jupyter nbconvert --to script --no-prompt notebook.ipynb - person bytestorm; 27.05.2019
comment
Спасибо openwonk за предложение. Это сработало как шарм: конвертировать все записные книжки в папку jupyter nbconvert --to script /path/to/notebooks/*.ipynb - person Rich Lysakowski PhD; 17.07.2019
comment
@bytestorm, --no-prompt у меня не работал через командную строку (# In[ ]: все еще там) - person alancalvitti; 02.08.2019
comment
@bytestorm, и можно тот самый блокнот, из которого вызывается nbconvert, сконвертировать? - person alancalvitti; 02.08.2019
comment
@alancalvitti @RishabhAgrahari вы нашли способ сгенерировать скрипт python для записной книжки jupyter без # In[ ]:? - person naman; 19.08.2019
comment
@naman, пока нет. Также автоматическое преобразование по умолчанию в JupyterLab аналогично сохраняет подсказки. - person alancalvitti; 19.08.2019
comment
@Sujen Shah, см. Jupytext для обратного преобразования. - person Wayne; 02.01.2020

Если вы хотите преобразовать все *.ipynb файлы из текущего каталога в скрипт Python, вы можете запустить команду следующим образом:

jupyter nbconvert --to script *.ipynb
person Břetislav Hájek    schedule 22.04.2018
comment
Или вы можете запустить: ipython nbconvert --to script * .ipynb - person Andrey; 23.12.2020

Вот быстрый и грязный способ извлечь код из ipynb V3 или V4 без использования ipython. Он не проверяет типы ячеек и т. Д.

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()
person Valentas    schedule 11.06.2015
comment
Лучший ответ, если вы не хотите устанавливать какие-либо инструменты Jupyter. - person dacracot; 03.10.2016
comment
Мне это нравится. Но я обнаружил, что когда я загружаю формат .py из записных книжек Jupyter, он использует окончания строк UNIX, даже если я нахожусь в Windows. Чтобы сгенерировать то же самое, добавьте newlines='\n' в качестве третьего аргумента в вызове открытого выходного файла. (Python 3.x) - person RufusVS; 30.05.2019
comment
Этот ответ открывает возможность читать теги и извлекать только те ячейки, в которых он есть. Сложнее сделать только через командную строку. - person Pablo Adames; 10.08.2020

Следуя предыдущему примеру, но с новой версией nbformat lib:

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'))
person Spawnrider    schedule 07.07.2016
comment
последняя строка кода, fh.writelines (source.encode ('utf-8')) дает 'TypeError: аргумент write () должен быть str, а не int', хотя fh.writelines (source) работает. - person BarryC; 18.10.2016
comment
Была та же проблема, исправленная путем отбрасывания части .encode('utf-8') в последней строке. - person LFoos24; 28.06.2021

Jupytext неплохо иметь в своей инструментальной цепочке для таких преобразований. Это позволяет не только конвертировать из записной книжки в сценарий, но и снова возвращаться от сценария к записной книжке. И даже выпустить этот блокнот в исполненном виде.

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 
person Wayne    schedule 02.01.2020
comment
По-видимому, есть также ipynb-py-convert, см. здесь. - person Wayne; 10.01.2020
comment
'jupytext' не распознается как внутренняя или внешняя команда, работающая программа или командный файл. ??? - person Amine Chadi; 31.03.2020
comment
Вы установили его @AmineChadi. См. здесь, чтобы узнать, как это сделать. Если вы используете его через блокнот в качестве интерфейса командной строки, вы можете просто запустить %pip install jupytext в своем блокноте. - person Wayne; 31.03.2020

Вы можете сделать это из IPython API.

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)
person justanr    schedule 04.10.2014

Для рекурсивного преобразования всех файлов формата * .ipynb в текущем каталоге в скрипты Python:

for i in *.ipynb **/*.ipynb; do 
    echo "$i"
    jupyter nbconvert  "$i" "$i"
done
person Don Smythe    schedule 23.10.2016
comment
Мне пришлось добавить аргумент --to script, чтобы избежать вывода HTML по умолчанию в Jupiter 4.4.0. - person trojjer; 21.11.2017

Я так понимаю, это старая ветка. Я столкнулся с той же проблемой и хотел преобразовать файл .pynb в файл .py через командную строку.

Мой поиск привел меня к ipynb-py-convert

Выполнив следующие шаги, я смог получить файл .py

  1. Установить pip install ipynb-py-convert
  2. Перейдите в каталог, в котором сохранен файл ipynb, через командную строку
  3. Введите команду

> ipynb-py-convert YourFileName.ipynb YourFilename.py

Например:. ipynb-py-convert Getting-started-with-kaggle-titanic-problem.ipynb getting-started-with-kaggle-titanic-problem.py

Вышеупомянутая команда создаст скрипт python с именем YourFileName.py и, как в нашем примере, создаст файл getting-started-with-kaggle-titanic-problem.py.

person Sachin Hatikankan    schedule 16.01.2021
comment
Это сработало! - person Redgar Tech; 29.03.2021

В следующем примере записная книжка Iron Python с именем a_notebook.ipynb превращается в скрипт Python с именем a_python_script.py, оставляя ячейки, помеченные ключевым словом remove, которые я добавляю вручную к ячейкам, которые я не хочу помещать в скрипт, без визуализации и другие шаги, которые, как только я закончу с записной книжкой, мне не нужно выполнять сценарием.

import nbformat as nbf
from nbconvert.exporters import PythonExporter
from nbconvert.preprocessors import TagRemovePreprocessor

with open("a_notebook.ipynb", 'r', encoding='utf-8') as f:
    the_notebook_nodes = nbf.read(f, as_version = 4)

trp = TagRemovePreprocessor()

trp.remove_cell_tags = ("remove",)

pexp = PythonExporter()

pexp.register_preprocessor(trp, enabled= True)

the_python_script, meta = pexp.from_notebook_node(the_notebook_nodes)

with open("a_python_script.py", 'w', encoding='utf-8') as f:
    f.writelines(the_python_script)
person Pablo Adames    schedule 10.08.2020

Есть очень хороший пакет под названием nb_dev, который предназначен для создания пакетов Python в Jupyter Notebooks. Подобно nbconvert,, он может превратить записную книжку в файл .py, но он более гибкий и мощный, поскольку имеет множество хороших дополнительных авторских функций, которые помогут вам разрабатывать тесты, документацию и регистрировать пакеты в PyPI. Он был разработан ребятами из fast.ai.

Это требует некоторого обучения, но документация хороша, и в целом это несложно.

person John    schedule 17.06.2020

У меня возникла эта проблема, и я попытался найти решение в Интернете. Хотя я нашел некоторые решения, у них все еще есть некоторые проблемы, например, раздражающее Untitled.txt автоматическое создание, когда вы запускаете новую записную книжку с панели инструментов.

В конце концов я написал свое собственное решение:

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

Чтобы использовать этот скрипт, вы можете добавить его в ~/.jupyter/jupyter_notebook_config.py :)

Обратите внимание, что вам может потребоваться перезапустить ноутбук / лабораторию jupyter, чтобы он заработал.

person Jiren Jin    schedule 10.09.2018
comment
Ссылка не работает - person Pablo Adames; 10.08.2020

В моей системе mint [ubuntu] на работе, хотя jupyter уже был установлен и ноутбуки работали, jupyter nbconvert --to script выдавал ошибку нет файла / каталога, пока я не сделал отдельный

sudo apt-get install jupyter-nbconvert

Потом с конвертацией все было нормально. Я просто хотел добавить это на случай, если кто-то обнаружит ту же ошибку (меня это сбивало с толку, так как я думал, что ошибка отсутствия файла, относящаяся к записной книжке, которая определенно была в локальном каталоге, потребовала времени, чтобы понять, что подкоманда не была установлен).

person Adrian Tompkins    schedule 11.06.2021

Команда %notebook foo.ipynb magic экспортирует текущий IPython в foo.ipynb.

Чтобы получить дополнительную информацию, введите %notebook?

person Robert Vanden Eynde    schedule 18.06.2021