ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Jupyter Notebook与JupyterLab实用技巧大全

Jupyter Notebook与JupyterLab实用技巧大全 你要是经常和数据打交道就不可能绕开 Jupyter Notebook 这个名字。它和 JupyterLab 已经成了我工作台上最常用的两个阵地但越是常用越觉得默认状态像个“毛坯房”目录要自己装、保存路径要找半天、文件误删了连个像样的回收站都找不到。这篇技巧大全是我把日常高频问题集中整理了一遍涵盖安装、内核管理、快捷键与魔术命令、Notebook 目录、默认保存路径、JupyterLab 回收站以及扩展交互等实用内容既适合刚上手的新手照着配置也适合想把手头环境调教得更顺手的老用户收藏备用。1. Jupyter Notebook 与 JupyterLab选对阵地很关键1.1 两个界面到底差在哪经常有人问我“Jupyter Notebook 和 JupyterLab 到底该选哪个”我的看法是入门学习用 Notebook 更直白日常干活我更推荐 JupyterLab。原因在于Notebook 的设计重心是“单个文档”——打开一个 .ipynb从上到下写代码、记 Markdown、看输出操作思路非常线性而 JupyterLab 把整个浏览器变成了一张工作台左侧有文件树中部是编辑器多个 Notebook 和终端可以同时平铺还有内置的目录面板。举一个我自己天天遇到的场景清洗一份销售数据时我通常要同时打开三个文件——一个写清洗脚本的 Notebook、一份验证 SQL 结果的终端、一个预览图表的 Notebook。在 JupyterLab 里把这三个标签页拖到同一屏就行在老版 Notebook 中只能在多个浏览器标签页之间来回切。一旦习惯了这种“鼠标一拖就能分屏”的体验几乎回不去 Notebook 的老界面。对比项Jupyter NotebookJupyterLab文档模式单文档开多个文件要开标签页多文档工作台支持拖拽分屏文件树默认较弱需额外扩展内置文件浏览器支持多根目录扩展机制依赖 nbextensions装起来略繁琐自带扩展管理器图形化安装内置终端基本没有内置终端和 Markdown 编辑器适合场景快速实验、教学演示数据分析、多任务并行、协作如果你刚开始学 Python直接用 Notebook 没问题因为它的工具栏和菜单更少不容易迷路。但如果你要做实际项目建议尽早切到 JupyterLab从这个界面迁移过去的成本比我预想的低很多换来的是翻倍的窗口管理效率。1.2 安装与内核管理最容易踩的坑安装这一步本身不难麻烦的是“装完之后用的不是同一套环境”。以 pip 安装为例pip install notebook jupyterlab用 conda 则执行conda install -c conda-forge notebook jupyterlab可很多同学在虚拟环境里装完 Jupyter启动后却 import 不到刚 pip install 的包或者内核列表里只有一个 Python 3看不到任何自定义环境。原因其实很简单Jupyter 服务是一个进程内核是另一个进程你在某个环境里装的包只有通过“那个环境对应的内核”启动的 Notebook 才看得到。解决办法是把你的环境注册成 Jupyter 内核python -m ipykernel install --user --namemyenv --display-namemyenv这里的--name是内核的唯一标识--display-name是你在 Notebook 界面里看到的名字。执行完回到 Kernel 菜单切换一下就能在同一个 Notebook 里自由选择不同环境。这个操作我几乎每换一台电脑就会做一次属于典型的“不知道会抓狂、知道后一劳永逸”。如果你需要让同一台机器上的其他用户通过浏览器访问还建议先创建配置文件并设置密码jupyter notebook --generate-config jupyter notebook password随后在jupyter_notebook_config.py里按需修改端口、是否允许远程访问。我的建议是共享环境里一定要结合防火墙做访问控制不要把服务直接暴露在不可信网络个人使用的话默认的localhost已经足够安全。2. 快捷键与魔术命令把日常节奏提起来2.1 先分清命令模式与编辑模式Notebook 的快捷键规则其实非常简单键盘操作分两种模式。很多新手经常发现按 B 没反应因为光标在单元格里时是编辑模式按 B 自然只是输入字母 b只有先按 Esc 把单元格边框变成蓝色进入命令模式再按字母键才会触发操作。理解这个切换逻辑快捷键就记住一半了。我平时最常用的一组快捷键如下操作快捷键备注运行单元格并跳到下一个Shift Enter最高频运行单元格但不移动Ctrl Enter调试单格在单元格上方插入Esc 后按 A命令模式在单元格下方插入Esc 后按 B命令模式删除单元格Esc 后连按两次 D会有确认提醒转成 MarkdownEsc 后按 M命令模式转成 CodeEsc 后按 Y命令模式选中下方多个单元格Shift 下方向键命令模式合并选中单元格Shift M命令模式快速查找代码Esc 后按 F类似 CtrlF如果你在用 JupyterLab还可以到 Settings - Keyboard Shortcuts 里自定义快捷键。我个人会把“运行全部单元格”设成一个不常用的组合比如AltR跑整份脚本时就不用去菜单里点了。老版 Notebook 想改键就比较麻烦这也是我逐渐偏向 JupyterLab 的原因之一。2.2 魔术命令一行顶十行魔术命令Magic Commands是 IPython 内核的特色在 Notebook 和 JupyterLab 里通用。下面这些是我写得最多、也最推荐记住的%matplotlib inline # 让图表直接嵌入输出区 %time func() # 打印单次运行耗时 %timeit func() # 多次运行取平均耗时 %who / %whos # 查看当前所有变量 %reset # 清空所有变量 %run train.py # 运行脚本并把结果留在命名空间 %load helper.py # 把文件内容读进单元格 !pip list # 直接执行系统命令 %%bash # 整个单元格按 bash 执行其中%timeit比%time更客观因为小任务在 Jupyter 里单次运行误差很大%timeit会自动跑若干轮取平均。每次做性能优化我都先用它定位瓶颈再针对瓶颈动手改。另一类很实用的是%%writefile。比如你想在 Notebook 里顺手生成一个.py脚本%%writefile model.py def predict(x): return x * 2执行后目录下会多出model.py。配合%run model.py可以把 Notebook 里的分析逻辑沉淀成独立模块而不是永远堆在单元格里。还有两个被低估的小习惯一是用变量或函数?查看帮助比如pd.read_csv?会弹出签名和文档加两个问号还能看到源码二是画图时在plt.show()后面加一个分号可以隐藏那一行文字输出。单看都是小技巧组合起来整个写代码的节奏会明显不一样。3. 给 Notebook 添加目录别再拿滚轮找标题3.1 为什么官方默认没有目录Jupyter Notebook 一直把“简洁”放在前面默认界面里没有侧边目录文档一长就只能从头往下翻。这个问题在老版 Notebook 里尤其明显一旦 Notebook 有上百个单元格想找某个小节简直是场噩梦。社区插件jupyter_contrib_nbextensions里的 Table of Contents (TOC2) 插件就是来补这个短板的。如果你已经切到 JupyterLab事情更简单新版 JupyterLab 原生内置了“目录”面板打开 Notebook 后左侧会自动按 Markdown 标题生成目录不需要额外装任何东西。所以这一节我会把两种界面的方案分开讲你用哪个版本就照哪个来。3.2 Notebook 老界面怎么安装 TOC2安装步骤很直接pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user jupyter notebookNotebook 打开后顶部菜单栏会出现一个 Nbextensions 标签。如果没看到多半是第二步没执行成功重新执行一次即可。在扩展列表里勾选Table of Contents (TOC2)之后每个 Notebook 的工具栏都会多出一个目录按钮点击后右侧会浮出可折叠目录。需要留意的是如果你装的是 notebook 7.x老牌jupyter_contrib_nbextensions可能不再兼容。这种情况下直接切到 JupyterLab 反而轻松这也是我后来迁移到 Lab 的原因之一——官方维护的原生目录始终比第三方插件更稳定。3.3 TOC2 的配置和常见误区TOC2 浮动面板顶部有个齿轮图标点开可以配置目录层级、是否显示编号、是否自动折叠、是否跟随滚动。我习惯把“跟随滚动高亮”打开写长文的时候一眼就能看到自己写到了哪个章节。这里必须提醒一个新手常踩的坑目录只识别 Markdown 标题不识别代码。如果你在代码单元格里写# 第一部分目录里不会出现必须把那个单元格切换到 Markdown再写# 第一部分才会被收录。如果标题下的正文都是代码单元格同样不会进入目录。很多人看到目录不对就以为是插件坏了其实问题出在标题格式。4. 默认保存路径别再和文件玩捉迷藏4.1 先确认当前工作目录新 Notebook 保存到哪里由启动 Jupyter 时的目录决定。如果你是在某个文件夹的终端里敲jupyter notebook启动的默认保存路径就是这个文件夹如果你是通过开始菜单或 IDE 快捷方式启动的保存路径往往不是想要的。快速确认的方法是在单元格里运行import os print(os.getcwd())也可以直接执行!pwdWindows 上用!cd。在 JupyterLab 里左侧文件树最上方显示的当前根目录就是同样的信息。先确认这些后面改路径才不会改错文件。4.2 三种修改默认路径的方法方式一启动参数。jupyter notebook --notebook-dirD:/workspace jupyter lab --notebook-dirD:/workspace这种方式是一次性的适合临时换目录。方式二改配置文件。jupyter notebook --generate-config打开~/.jupyter/jupyter_notebook_config.pyWindows 是C:\Users\用户名\.jupyter\jupyter_notebook_config.py新增或修改c.ServerApp.root_dir D:/workspace保存后重启 Jupyter 即可。老版本 notebook 里配置键是c.NotebookApp.notebook_dir如果你还在用 notebook 7 以下版本写这个也能识别新版本建议用c.ServerApp.root_dir。方式三启动脚本封装。在 Linux/macOS 上我习惯在~/.bashrc里加一个 aliasalias jncd ~/projects/jupyter jupyter labWindows 上则做一个简单的.bat启动脚本先cd /d D:\workspace再启动 Jupyter双击就能进入固定工作目录。我个人强烈建议给 Jupyter 单独建一个工作目录不要把桌面或下载文件夹当默认目录。因为 Notebook 会在目录下生成大量.ipynb_checkpoints自动保存文件夹混在其他文件里特别容易凌乱。单独目录还有个好处备份时整个目录压缩即可做 Git 管理时也不会误提交一堆无关文件。4.3 路径相关的工程化细节Jupyter 默认生成的.ipynb_checkpoints其实是自动保存的快照有时误删文件后能从这里捞回旧版本。但它也很容易把 Git 仓库弄乱所以一定要加.gitignore.ipynb_checkpoints/在 Notebook 内部引用数据文件时我习惯在顶部固定一个BASE_DIRfrom pathlib import Path BASE_DIR Path.cwd()如果 Notebook 启动位置并不总是项目根目录更稳的做法是直接写绝对路径BASE_DIR Path.home() / workspace / sales-project这样不管你在哪个执行目录下跑都能定位到数据文件。换电脑时只要改这一行整个脚本就能重新跑起来不用逐个单元找路径。5. JupyterLab 回收站文件误删后到底去哪了5.1 先泼盆冷水它并不是完整回收站“JupyterLab 回收站在哪”是高频问题但真相是早期版本的 JupyterLab 根本没有本地回收站左侧文件树里按 Delete 会直接把文件从磁盘抹掉。后来版本加入了有限的撤销机制但它更像“撤销删除”缓存而不是操作系统那种有界面的回收站。你删除文件后马上按 CtrlZ 或许能恢复但如果重启了 JupyterLab撤销缓存基本就没了。所以在 JupyterLab 里删除文件前一定要多看一眼文件名。这里没有 Windows 回收站那种“先进去再后悔还能拿回来”的缓冲操作代价比你想的大。5.2 误删后的恢复尝试顺序如果刚误删可以按这个顺序尝试在左侧文件树中点击被删文件原来所在目录让文件浏览器保持在该上下文。立即按 CtrlZ看文件是否重新出现没反应就再试一次。找不到就检查该目录下的.ipynb_checkpoints文件夹里面可能保留最近一次自动保存的版本。如果文件在云同步盘如 OneDrive、坚果云里去云盘网页版回收站找Linux 服务则看文件系统有没有 Trash 目录。还有一条终极兜底如果你从第一天开始就把整个工作目录做成 Git 仓库误删后一条git checkout就能找回。这是我最推荐的做法比依赖任何回收站都靠谱。每天写完一段代码就git add . git commit成本很低收益极高。5.3 防误删的几条“保命”习惯在 JupyterLab 设置里搜索“Delete”尽量开启删除确认相关选项不同版本位置略有差异。不要用!rm或os.remove()在 Notebook 里批量删文件尤其是通配符操作误删后没有撤销机会。删除文件前先用!ls看一下目标目录确认没有把脚本目录当成临时目录处理。核心 Notebook 和多轮运行后的实验文件定期导出备份或者放进 Git 仓库历史。这一节我自己踩过最大的坑是一次想清空日志文件顺手写了!rm *.log结果工作目录里恰好有几个带.log字样的数据备份。还好文件名并不是严格以.log结尾才没酿成大错。但那次之后我再也不敢在 Notebook 里执行删除命令了说出来希望大家别重蹈覆辙。6. 进阶玩法扩展、交互控件与一键导出6.1 值得装的 JupyterLab 扩展JupyterLab 的扩展生态比老版 Notebook 自由得多装扩展就像装 IDE 插件。我长期保留这几款jupyterlab-git左侧面板直接看变更、提交、分支配合“目录做成仓库”这一招非常好用。jupyterlab-spellchecker给 Markdown 单元格做拼写检查写英文报告时很省心。jupyter-resource-usage在状态栏显示内存和 CPU 占用防止 Notebook 悄悄吃爆内存。ryantam626/jupyterlab_code_formatter支持 black、autopep8、isort一键格式化代码。安装方式一般是pip install jupyterlab-git jupyterlab-spellchecker jupyter-resource-usage jupyter lab build注意老版本 JupyterLab 装第三方扩展还需要jupyter labextension install新版本用pip install后执行jupyter lab build即可。装完之后重启 JupyterLab左侧或状态栏就会多出对应功能。6.2 用 ipywidgets 把 Notebook 变成交互面板做数据探索时我经常用ipywidgets做交互式筛选比一遍遍改参数重新执行方便太多import ipywidgets as widgets from IPython.display import display import pandas as pd df pd.read_csv(sales.csv) def show_range(min_price, max_price): subset df[(df[price] min_price) (df[price] max_price)] print(subset.shape) return subset.head() min_slider widgets.IntSlider(value0, min0, max1000, description最低价) max_slider widgets.IntSlider(value500, min0, max1000, description最高价) ui widgets.VBox([min_slider, max_slider]) out widgets.interactive_output(show_range, {min_price: min_slider, max_price: max_slider}) display(ui, out)拖动滑块输出区域会自动更新非常适合给非技术同事做报表演示。它本质上是前端控件绑定 Python 回调不需要懂前端也能用。更简单的写法是用interact装饰器from ipywidgets import interact interact(coldf.columns) def plot_col(col): df[col].hist()下拉菜单一换图就跟着变做临时探索时效率极高。6.3 一键导出不同格式交付报告不发愁Jupyter 的强项是“可复现分析”把分析结果分享出去时导出功能很重要。命令行导出示例jupyter nbconvert --to html notebook.ipynb jupyter nbconvert --to markdown notebook.ipynb jupyter nbconvert --to script notebook.ipynb--to script会把所有单元格抽成.py文件适合交付纯代码--to markdown适合发技术博客图片会自动保存成相对路径。想导出 PDF 也可以但通常需要安装 LaTeX 环境Windows 装 TeX Live 或 MiKTeX 比较麻烦我一般先导出 HTML再用浏览器“打印为 PDF”效果也不错。6.4 主题、字体与界面微调如果对默认白底界面审美疲劳可以在 JupyterLab 的 Settings - Theme 里切换 JupyterLab Dark。想更花哨就装第三方主题比如jupyterlab/theme-dark-blue在新版扩展管理器里直接搜索安装即可。字体方面我建议把编辑器字体调成等宽字体例如 JetBrains Mono代码对齐会清晰很多。在 Settings - Editor 的 Font Family 里填入字体名称Windows 需要先安装字体才能生效。再配合jupyter-resource-usage在右下角显示内存占用跑长任务时心里有个数基本不会出现内存突然爆掉才发现的情况。这些都属于可选优化按需食用即可。
返回列表