使用Python dict以编程方式使用nbformat创建Jupyter Notebook

时间:2018-09-08 03:09:39

标签: python jupyter-notebook

我试图按以下顺序创建一个具有3个降价单元和3个代码单元的Jupyter笔记本

Markdown cell 1
import numpy as np
import pandas as pd

Markdown cell 2
project_id=53

Markdown cell 3
import mysql.connector

我正在使用this gistnbformat documentation,但是我已经将行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 :(得分:1)

这里有几个问题。

1)您将在循环的每次迭代中覆盖cells列表。

2)单元格是markdown或code,尚不清楚为什么您要使用字典中包含看起来像markdown的键和看起来像是code的值。您总共要制作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) ])

这将在循环的每次迭代中添加一个markdown单元格和一个代码单元格。

如果只需要代码单元,则可以尝试以下操作:

nb['cells'] = []
for v in d.values():
    nb['cells'].append(nbf.v4.new_code_cell(v))