我的 Jupyter 笔记本越来越长了,这让导航变得困难。
我想将每个章节(以 Heading 1 开始的单元格)保存到不同的文件中。我该怎么做?似乎无法在多个笔记本之间剪切和粘贴多个单元格。
我的 Jupyter 笔记本越来越长了,这让导航变得困难。
我想将每个章节(以 Heading 1 开始的单元格)保存到不同的文件中。我该怎么做?似乎无法在多个笔记本之间剪切和粘贴多个单元格。
这是我使用的方法 - 有些棘手,但它有效:
我相信开发人员可能正在为未来的版本开发更好的解决方案。
import json
from pprint import pprint
import re
def notebook_spliter(FILENAME, chapter_num):
with open(FILENAME + '.ipynb') as data_file:
data = json.load(data_file)
copy_cell, chapter_in = list(), False
regx = re.compile("## [0-9]+\. ")
for num in range(len(data['cells'])):
if chapter_in and data['cells'][num]['cell_type'] != 'markdown':
copy_cell.append(data['cells'][num])
elif data['cells'][num]['cell_type'] == 'markdown':
regx_result = regx.match(data['cells'][num]['source'][0])
if regx_result:
print (regx_result.group())
regx2 = re.compile("[0-9]+")
regx2_result = regx2.search(regx_result.group())
if regx2_result:
print (int(regx2_result.group()))
if chapter_in == False:
if chapter_num == int(regx2_result.group()):
chapter_in = True
copy_cell.append(data['cells'][num])
else:
if chapter_num != int(regx2_result.group()):
break
elif chapter_in:
copy_cell.append(data['cells'][num])
copy_data["cells"] = copy_cell
copy_data["metadata"] = data["metadata"]
copy_data["nbformat"] = data["nbformat"]
copy_data["nbformat_minor"] = data["nbformat_minor"]
with open(FILENAME + '-' + str(chapter_num) + '.ipynb', 'w') as fd:
json.dump(copy_data, fd, ensure_ascii=False)
copy_data = dict()
FILENAME = 'DS&AL1'
CHAPTERS = list()
with open(FILENAME + '.ipynb') as data_file:
data = json.load(data_file)
for num in range(len(data['cells'])):
if data['cells'][num]['cell_type'] == 'markdown':
regx_result = regx.match(data['cells'][num]['source'][0])
if regx_result:
regx2 = re.compile("[0-9]+")
regx2_result = regx2.search(regx_result.group())
if regx2_result:
CHAPTERS.append(int(regx2_result.group()))
print (CHAPTERS)
for chapternum in CHAPTERS:
notebook_spliter(FILENAME, chapternum)
几年后,幸运的是有一个库可以为您完成这样的事情:
pip install nbmanips
nb select has_html_tag h1 | nb split -s nb.ipynb
命令的第一部分 (nb select has_html_tag h1
) 指定了在哪些单元格上执行拆分操作。
第二部分 (nb split -s nb.ipynb
) 基于管道选择拆分笔记本。 -s
标志告诉 nbmanips 使用选择而不是单元格索引。
来源: https://towardsdatascience.com/split-your-jupyter-notebooks-in-2-lines-of-code-de345d647454
nbmanips
所能轻松实现的范围,我建议看一下[https://nbformat.readthedocs.io/en/latest/api.html#]。`nbformat`作为Jupyter的一部分提供,因此它可以在你运行笔记本的任何地方运行,而无需额外的包。也许一个好的开始位置是[这里](https://dev59.com/srP3oIgBc1ULPQZFhfZH#71244733),因为问题是相关的。我已经在[这里](https://discourse.jupyter.org/search?q=nbformat%20%40fomightez)发布了带有代码的示例。 - Wayne{
"metadata": {
"name": "",
"signature": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Chapter 1"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"1+1"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 1,
"text": [
"2"
]
}
],
"prompt_number": 1
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Chapter 2"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"2+2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"4"
]
}
],
"prompt_number": 2
}
],
"metadata": {}
}
]
}