Используйте Python dict для программного создания блокнота Jupyter с помощью nbformat - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать блокнот Jupyter с 3 ячейками уценки и 3 ячейками кода в следующем порядке

Markdown cell 1
import numpy as np
import pandas as pd

Markdown cell 2
project_id=53

Markdown cell 3
import mysql.connector

Я использую эту суть и документацию nbformat , но я обернул строку nb['cells'] = [nbf.v4.new_markdown_cell(text), nbf.v4.new_code_cell(code)] внутри цикла Python for.

Вот мой код

import nbformat as nbf

d = {
"""Markdown cell 1""":
"""\
import numpy as np
import pandas as pd
""",
"""Markdown cell 2""":
"""\
project_id=53""",
"""Markdown cell 3""":
"""\
import mysql.connector"""
}

nb = nbf.v4.new_notebook()

for k, v in d.items():
    nb['cells'] = [nbf.v4.new_markdown_cell(k), nbf.v4.new_code_cell(v) ]

nbf.write(nb, "test.ipynb")

Задача

Это создает файл блокнота Jupyter. Однако записная книжка содержит только последнюю ячейку Markdown (ячейка Markdown 3) и последнюю ячейку кода (ячейка Code 3)

  • вот содержимое "test.ipynb" блокнота, созданного с помощью вышеуказанного скрипта

    Markdown cell 3
    import mysql.connector
    
  • вот содержимое "test.ipynb" записной книжки, которое отсутствует

    Markdown cell 1
    import numpy as np
    import pandas as pd
    
    Markdown cell 2
    project_id=53
    

Я думаю, что команда nb['cells'] многократно перезаписывает одну и ту же ячейку, но я не знаю, как обойти это. После того, как он создаст первую ячейку, я не знаю, как указать, что он должен перейти к следующей ячейке ниже.

Вопрос

Есть ли способ создать несколько ячеек в блокноте Jupyter программно?

Версия

  1. python = 3,6
  2. jupyter notebook = 5.0.0
  3. nbformat==4.4.0

1 Ответ

0 голосов
/ 08 сентября 2018

Здесь есть пара проблем.

1) Вы перезаписываете список cells на каждой итерации цикла.

2) Ячейка - это либо уценка, либо код, не понятно, почему у вас есть этот словарь с ключами, которые выглядят как уценки, и значениями, которые выглядят как код. Вы делаете 6 клеток всего или 3?

Если вы хотите шесть ячеек - ключ dict, за которым следует значение dict - попробуйте это:

nb['cells'] = []
for k, v in d.items():
    nb['cells'].extend([nbf.v4.new_markdown_cell(k), nbf.v4.new_code_cell(v) ])

Это добавит ячейку уценки и ячейку кода в каждой итерации цикла.

Если вам нужны только ячейки кода, попробуйте следующее:

nb['cells'] = []
for v in d.values():
    nb['cells'].append(nbf.v4.new_code_cell(v))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...