如何拆分ipython笔记本

时间:2014-09-01 03:36:39

标签: jupyter-notebook

我的Jupyter笔记本电脑变得越来越长,导致难以导航。

我想将每章(从标题1开始的Cel)保存到不同的文件。我怎样才能做到这一点?在笔记本电脑之间剪切和粘贴多个单元似乎是不可能的。

3 个答案:

答案 0 :(得分:6)

这是我使用的方法 - 它有点尴尬,但它有效:

  1. 使用File-> Make Copy制作主笔记本的多个副本 从菜单中。为每个要提取的章节制作一个副本。
  2. 重命名每章的副本:例如将“master-copy0”重命名为“第1章”。
  3. 删除不属于第1章的每个单元格 - 例如在命令模式下使用“dd”。
  4. 保存缩写文件。
  5. 为每章重复步骤3和4.
  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章后面,这就是你可以做的事情

  1. 搜索“等级”:1
  2. 你找到了 {      “cell_type”:“标题”,      “1级,  “元数据”:{},      “资源”: [   “第1章”  ] }, 和 {  “cell_type”:“标题”,  “1级,  “元数据”:{},  “资源”: [   “第2章”  ] },
  3. 从第一个搜索结果的开头移动所有内容,位于第二个搜索结果的末尾
  4. 注意逗号
  5. 您可以以类似的方式操作多个笔记本。

    这是示例<。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": {}
      }
     ]
    }