一键修复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 脚本:
-
加载
.ipynb
文件的 JSON 内容 -
遍历所有 cell
-
提取
\"cell_type\": \"code\"
类型的\"source\"
内容 -
拼接成纯 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 文件损坏的情况,不妨试试这个脚本,可能就能帮你挽回几个小时的心血。希望这个小工具能帮到你!