背景
最近在寫一個數據分析項目時,不幸遇到了 斷電導致電腦重啟 的突發情況。當我再次打開 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,需要 joincode_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 文件損壞的情況,不妨試試這個腳本,可能就能幫你挽回幾個小時的心血。希望這個小工具能幫到你!