背景
最近在写一个数据分析项目时,不幸遇到了 断电导致电脑重启 的突发情况。当我再次打开 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 json
def 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 ts
df = ts.get_k_data('000001')
df.head()
# ---- Cell 1 ----
print(df.describe())
如果你也不幸遇到了 notebook 文件损坏的情况,不妨试试这个脚本,可能就能帮你挽回几个小时的心血。希望这个小工具能帮到你!