1. 为什么你需要这个脚本?一个真实的故事
几年前,我刚开始接触机器学习项目,团队里每个人都在用Jupyter Notebook写实验报告。这东西好用是好用,可视化强,能边写代码边记笔记。但问题来了,当我们需要把整个项目的逻辑整理成文档,或者想把代码提交到版本控制系统时,麻烦就大了。你总不能把一堆.ipynb文件直接扔过去吧?领导要看文字报告,同事要复用你的核心算法,你难道让人家在一个个单元格里找代码?
我当时就干过傻事,手动打开每个.ipynb文件——这其实是个JSON格式的文件——然后一个单元格一个单元格地复制代码和文字,再粘贴到文本编辑器里。处理三五个文件还行,有一次项目复盘,面对几十个迭代版本的Notebook,我差点崩溃。不仅效率极低,还容易出错,漏掉某个单元格或者复制了不该复制的输出结果,是常有的事。
自那以后,我就下定决心,必须把这件事自动化。今天要跟你分享的,就是我这几年用下来最顺手、最稳定的方法:用Python写个脚本,自动扒开.ipynb文件的外壳,把里面的“血肉”——也就是代码和Markdown笔记——干干净净地提取出来,合并保存到一个清爽的.txt文本文件里。别小看这个操作,它特别适合以下几种场景:
- 项目文档化:你需要把探索性数据分析(EDA)的过程、模型训练的逻辑,用纯文本的形式整理出来,附在项目报告里。
- 代码备份与迁移:想把Notebook里的核心函数搬到正式的
.py脚本或模块里,用这个脚本提取能避免手抄带来的错误。 - 批量处理:老师收了上百份学生提交的
.ipynb作业,需要快速提取代码进行查重或评分;团队有大量历史Notebook需要归档分析。 - 简化分享:有些协作环境只支持上传文本文件,或者你需要把内容粘贴到某些不支持复杂格式的平台上。
说白了,这个脚本就像是一个专为Jupyter Notebook打造的“榨汁机”,丢进去整个水果(.ipynb),出来就是去掉了果皮果壳(JSON结构、输出结果、元数据)的纯果汁(代码和文字)。接下来,我就手把手带你从零开始,造出这台“榨汁机”。
2. 动手之前:准备好你的“工具箱”
工欲善其事,必先利其器。咱们这个自动化提取脚本,依赖一个非常核心的Python库:nbformat。可以说,它是我们能够轻松读取和操作.ipynb文件的“官方钥匙”。
2.1 理解.ipynb文件的本质
在装工具之前,咱们先花一分钟看看要处理的“原材料”到底是什么。用文本编辑器(比如VS Code、Sublime Text甚至系统自带的记事本)强行打开一个.ipynb文件,你会看到满屏的JSON(JavaScript Object Notation)格式文本。它结构清晰,但内容繁杂,大致长这样:
{
"cells": [
{
"cell_type": "markdown",
"source": ["## 这是一个标题\\n", "这是Markdown单元格的内容。"]
},
{
"cell_type": "code",
"source": ["import pandas as pd\\n", "print('Hello, World!')"],
"outputs": [...],
"execution_count": 1
}
],
"metadata": {...},
"nbformat": 4,
"nbformat_minor": 5
}
你看,所有内容都装在"cells"这个列表里,每个单元格(cell)用"cell_type"字段标明自己是"code"(代码)还是"markdown"(标记文本)。我们脚本的任务,就是像逛超市一样,遍历这个列表,只拿我们想要的“商品”(source字段里的内容),至于那些"outputs"(代码运行结果)、"execution_count"(执行次数)和"metadata"(元数据)等“包装盒”,我们统统不要。nbformat库的强大之处在于,它帮我们做好了JSON解析的工作,让我们可以直接用cell.cell_type和cell.source这样直观的方式来访问内容,完全不用自己手动去解析复杂的JSON结构。
2.2 安装必备的Python库
确保你的电脑上已经安装了Python(建议3.6以上版本)。然后,打开你的命令行(Windows上是CMD或PowerShell,Mac/Linux上是Terminal),安装我们唯一的“主力武器”:
pi

233

被折叠的 条评论
为什么被折叠?



