IPYNB Notebook(.ipynb)
概览
这个 skill 用于指导你以“工程化”的方式操作 .ipynb 文件与 notebook 项目(不限定 Jupyter,也适用于 Google Colab / VS Code Notebook 等环境):
- •清晰的文件结构:notebook 作为界面,逻辑沉到可复用的
scripts/与lib/ - •Token 高效工作流:在 AI 读写 notebook 时尽量只读结构/代码,不读大输出
- •可展示模式:用于 demo、团队共享、文档化的结构与输出规范
- •可复现环境:优先使用
uv,或退回到venv,确保可重复运行
适用场景
在以下场景使用本 skill:
- •新建 notebook 项目或单个 notebook
- •审阅 / 编辑已有
.ipynb(尤其是大文件、输出很多、diff 难读的情况) - •整理 notebook 项目结构,把“可复用逻辑”从 notebook 抽到模块/脚本
- •为演示、分享、归档做“可跑通、可复现、可导出”的整理
- •改善 notebook 的长期可维护性与版本控制体验
核心原则
Notebook 是界面(interface),不是库(library)。
notebook 适合交互探索与叙事展示;可复用、可测试、可自动化的逻辑应放在:
- •
scripts/:可直接运行的脚本(不依赖 notebook UI) - •
lib/:可复用模块(被 notebook 与脚本共同 import)
这样做带来的收益:
- •多 notebook 复用同一套逻辑
- •无需跑 notebook 就能测试关键逻辑
- •更容易在 CI/CD 中自动化执行(如导出、定时跑数)
- •diff 更干净、版本控制更友好
快速上手
新建一个 notebook 项目(推荐 uv)
- •
初始化项目(uv)
bash# Create project directory mkdir notebook-project && cd notebook-project # Initialize uv project uv init # Add dependencies (pick what you need) uv add jupyterlab pandas plotly
- •
建立目录结构
bashmkdir -p scripts lib data/{raw,processed} reports docs .archive touch data/.gitkeep data/raw/.gitkeep data/processed/.gitkeep reports/.gitkeep - •
准备
.gitignore(示例)gitignore# Virtual environments .venv/ # Data and outputs (keep .gitkeep) data/** !data/**/ !data/**/.gitkeep reports/** !reports/**/ !reports/**/.gitkeep # Jupyter .ipynb_checkpoints/ # Python __pycache__/ *.pyc # Environment .env
- •
启动 notebook 环境
bashuv run jupyter lab
- •
需要更详细的模式时再加载引用文档:
- •
references/file-structure.md:目录结构与项目组织 - •
references/presentation-patterns.md:演示/分享结构与输出规范 - •
references/token-efficiency.md:AI 读写 notebook 的 token 高效策略
- •
审阅 / 对比一个已有 notebook(尽量只看结构与代码)
推荐工作流:
- •
先看结构,不读输出
bash# Cell types and counts jq '.cells | group_by(.cell_type) | map({type: .[0].cell_type, count: length})' notebook.ipynb # Code cells with outputs jq '[.cells[] | select(.cell_type == "code") | select(.outputs | length > 0)] | length' notebook.ipynb - •
只对比代码 cell
bash# Extract code sources to compare jq '.cells[] | select(.cell_type == "code") | .source' notebook1.ipynb > /tmp/code1.json jq '.cells[] | select(.cell_type == "code") | .source' notebook2.ipynb > /tmp/code2.json diff /tmp/code1.json /tmp/code2.json
- •
确有必要再读取 notebook 正文
- •先明确要读哪一段、哪类 cell,再读
- •大 notebook 优先按 cell 范围/主题分段读取
- •细节见
references/token-efficiency.md
整理一个 notebook 项目(抽逻辑、控输出、让它可复现)
目录组织建议见 references/file-structure.md。这里给一个可执行的最小迁移步骤:
- •盘点根目录文件数量:
ls -1 | wc -l - •移动脚本到
scripts/,文档到docs/,旧 notebook 到.archive/ - •更新 notebook 中的 import:
from lib import module_name - •验证仍可正常运行
可复现环境(uv / venv)
为什么优先 uv?
uv 适合做以下事情:
- •快速、可复现的依赖管理
- •在项目依赖环境中运行工具(如
jupyter,nbconvert) - •不污染全局 Python
- •跨平台一致性更好
常用命令模式
添加依赖:
uv add plotly pandas duckdb
安装工具(可选):
uv tool install jupyterlab
在项目环境中运行:
uv run jupyter lab
单文件脚本声明依赖(用于 uv run):
# /// script # requires-python = ">=3.11" # dependencies = [ # "pandas", # "plotly", # ] # /// import pandas as pd import plotly.express as px # Script code here
运行:uv run script.py
如果你不能使用 uv,也可以用 python -m venv .venv + pip,但要确保能一键复现(建议 requirements.txt 或 pyproject.toml + lockfile)。
Token 高效工作流(面向 AI 与版本控制)
当通过 AI 助手读写 .ipynb 时:
默认策略:提交前清理输出
推荐 pre-commit:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/kynan/nbstripout
rev: 0.6.1
hooks:
- id: nbstripout
确需保留输出时(不推荐):
SKIP=nbstripout git commit -m "Add notebook with visualization outputs"
更常见的做法是:输出落盘到 reports/,notebook 保持“可重新运行即可复现输出”(见 references/token-efficiency.md)。
读之前先查询(结构优先)
先看结构:
jq '.cells | group_by(.cell_type) | map({type: .[0].cell_type, count: length})' notebook.ipynb
只看代码:
jq '.cells[] | select(.cell_type == "code") | .source' notebook.ipynb
输出要“可控、可复现”
倾向输出摘要,不要直接 dump 大对象:
print(f"[OK] Loaded {len(df_alarms):,} rows")
print(f"Columns: {', '.join(df_alarms.columns)}")
print(f"Date range: {df_alarms['timestamp'].min()} to {df_alarms['timestamp'].max()}")
大输出落盘到文件:
fig.write_html(report_dir / "visualization.html")
print(f"[OK] Saved visualization to {report_dir}/visualization.html")
完整策略见 references/token-efficiency.md。
演示 / 分享模式
推荐的 notebook 结构
- •标题与概览 - 背景与目标
- •准备 - 导入与配置
- •数据加载 - 带反馈与错误处理
- •摘要 - 高层统计
- •可视化 - 带解释与使用提示
- •结论 - 关键发现
更“专业”的输出习惯
统一状态输出:
print("[OK] Success")
print("[WARN] Warning")
print("[ERR] Error")
print("[INFO] Note")
数字格式化:
print(f"Total: {count:,}") # 2,055 instead of 2055
按日期落盘到 reports:
from datetime import datetime
today = datetime.now().strftime('%Y-%m-%d')
report_dir = Path("reports") / today
report_dir.mkdir(parents=True, exist_ok=True)
fig.write_html(report_dir / "chart.html")
latest = Path("reports/latest")
if latest.exists():
latest.unlink()
latest.symlink_to(today, target_is_directory=True)
完整模式与模板见 references/presentation-patterns.md。
资源索引
references/file-structure.md
包含:
- •推荐目录结构
- •文件组织规则与命名约定
- •Git 友好(ignore、diff、清理输出)
- •现有项目迁移步骤
- •示例结构
适合在: 新建项目、重构目录、统一约定时加载。
references/token-efficiency.md
包含:
- •输出清理与版本控制策略
- •不读输出的结构化查询方法
- •大 notebook 的分段读取与 diff 思路
- •常用
jq/ CLI 模式 - •cell 输出管理
适合在: 需要省 token、要审阅大 notebook、要做自动化处理时加载。
references/presentation-patterns.md
包含:
- •演示型 notebook 的结构模板
- •可读性与叙事节奏
- •交互元素与可导出策略
- •错误处理与可复现检查点
- •Markdown / Code cell 分工
- •导出 HTML/PDF 的注意事项
适合在: 做 demo、团队分享、发布文档前加载。
最佳实践速记
- •结构:notebook 作为界面,逻辑下沉到
scripts//lib/ - •依赖:优先 uv,保证一键复现
- •版本控制:默认清理输出(pre-commit/nbstripout/nbconvert)
- •省 token:先查询结构再阅读;大输出落盘
- •展示:叙事清晰、输出克制、错误处理明确
- •可复现:确保 “Restart & Run All” 能跑通
- •数据流:raw → processed → reports
- •Git 友好:忽略数据与产物,保留目录骨架(
.gitkeep)
示例流程
# 1. Create project
mkdir my-analysis && cd my-analysis
uv init
uv add jupyterlab pandas plotly
# 2. Set up structure
mkdir -p scripts lib data/{raw,processed} reports
touch data/.gitkeep data/raw/.gitkeep data/processed/.gitkeep reports/.gitkeep
# 3. Create notebook
uv run jupyter lab
# 4. As you work:
# - Keep logic in lib/ and scripts/
# - Save outputs to reports/ with dates
# - Keep outputs minimal
# - Strip outputs before committing
# 5. Before presenting:
# - Run "Restart & Run All" to test
# - Add context and documentation
# - Consider exporting to HTML
jupyter nbconvert --to html --execute notebook.ipynb
速查表
目录组织:
- •Notebook:项目根目录(或按规模拆到
notebooks/) - •脚本:
scripts/ - •模块:
lib/ - •数据:
data/raw/,data/processed/ - •报告:
reports/YYYY-MM-DD/ - •归档:
.archive/
uv 常用命令:
- •
uv init:初始化项目 - •
uv add <package>:添加依赖 - •
uv run <command>:在项目环境中运行命令 - •
uvx <tool>:运行临时工具(不写入项目依赖)
省 token:
- •清理输出:pre-commit hook,或
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace notebook.ipynb - •查询结构:
jq '.cells | group_by(.cell_type)' - •对比代码:
jq '.cells[] | select(.cell_type == "code") | .source'
展示:
- •数字格式化:
{count:,} - •按日期落盘:
reports/YYYY-MM-DD/ - •执行验证:
jupyter nbconvert --execute