> 技术文档 > 一键修复ipynb,Jupyter Notebook损坏文件

一键修复ipynb,Jupyter Notebook损坏文件


背景

最近在写一个数据分析项目时,不幸遇到了 断电导致电脑重启 的突发情况。当我再次打开 Jupyter Notebook 文件.ipynb)时,发现文件已经损坏,Jupyter 无法正常读取它,甚至有时直接报错:

Unreadable Notebook: NotJSONError: Notebook does not appear to be JSON

当时脑袋一热,以为几小时的工作都白费了。但 .ipynb 文件本质是 一个 JSON 格式的文本文件,所以理论上,我们仍然有机会手动提取出其中的代码部分

于是我写了一个小脚本,成功地把所有代码提取出来保存为 .py 文件,也成功“自救”!

解决思路

Jupyter Notebook 的每个代码单元(Code Cell)结构如下:

{ \"cell_type\": \"code\", \"source\": [ \"import numpy as np\\n\", \"print(np.arange(10))\\n\" ], ...}

我们可以写个 Python 脚本:

  1. 加载 .ipynb 文件的 JSON 内容

  2. 遍历所有 cell

  3. 提取 \"cell_type\": \"code\" 类型的 \"source\" 内容

  4. 拼接成纯 Python 文件并保存

具体解决方案的代码

import jsondef extract_code_from_ipynb(ipynb_path, output_py_path): with open(ipynb_path, \'r\', encoding=\'utf-8\') as f: data = json.load(f) code_lines = [] for idx, cell in enumerate(data.get(\'cells\', [])): if cell.get(\'cell_type\') == \'code\': code_lines.append(f\"# ---- Cell {idx} ----\") code = \'\'.join(cell.get(\'source\', [])) # 是一个 list,需要 join code_lines.append(code) code_lines.append(\'\\n\') # 添加空行分隔 with open(output_py_path, \'w\', encoding=\'utf-8\') as f: f.write(\'\\n\'.join(code_lines)) print(f\"提取完成,代码已保存到:{output_py_path}\")

假设你的 notebook 文件名为 tushare_usage.ipynb,运行:

extract_code_from_ipynb(\'tushare_usage.ipynb\', \'tushare_usage_recovered.py\')

脚本会生成一个新的 Python 文件,包含你所有的代码:

# ---- Cell 0 ----import tushare as tsdf = ts.get_k_data(\'000001\')df.head()# ---- Cell 1 ----print(df.describe())

如果你也不幸遇到了 notebook 文件损坏的情况,不妨试试这个脚本,可能就能帮你挽回几个小时的心血。希望这个小工具能帮到你!