我的Jupyter笔记本电脑变得越来越长,导致难以导航。
我想将每章(从标题1开始的Cel)保存到不同的文件。我怎样才能做到这一点?在笔记本电脑之间剪切和粘贴多个单元似乎是不可能的。
答案 0 :(得分:6)
这是我使用的方法 - 它有点尴尬,但它有效:
我相信开发人员可能会为未来版本制定更好的解决方案。
答案 1 :(得分:1)
笔记本文件是json格式,因此我将所有数据都以JSON格式获取并自动将其拆分为多个文件。
这段代码就是我所做的。
代码似乎很复杂,但是如果你只检查它一段时间就很简单,这是一个单独的文件http://www.fun-coding.org/DS&AL4-1.html的例子,我把它拆分后也转换为HTML。
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)
这是检查笔记本文件中章节号的功能。我在降序单元格中使用'## 1. chapter name'在笔记本文件中添加了章节编号,所以只需检查## digit。正则表达式。
然后,下一个代码是将单元格数据复制到此章节编号中,并将唯一复制的单元格和其他单元格(metadata,nbformat和nbformat_minor)保存到单独的文件中。
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)
答案 2 :(得分:0)
最简单的方法可能是在文本编辑器中编辑.ipnb文件。 下面我列出了一个非常简单的笔记本的内容。
笔记本看起来像
第1章
在[1]中: 1 + 1
Out [1]:2
第2章
在[2]中:2 + 2
输出[2]: 4
要取出第1章并将其放在第2章后面,这就是你可以做的事情
您可以以类似的方式操作多个笔记本。
这是示例<。p>的.ipnb文件
{
"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": {}
}
]
}