Jupyter Notebook读取pickle报EOFError但Python解释器正常
Jupyter Notebook读取Pickle文件触发EOFError的排查方案
问题背景
使用名为ai的conda环境同时进行Shell命令行和Jupyter Notebook数据分析:
- 67M的pickle文件,在激活
ai环境的Shell中执行df = pd.read_pickle("file.pickle")可正常加载 - 同一环境的Jupyter Notebook中执行相同代码,抛出
EOFError: Ran out of input,完整报错栈如下:
--------------------------------------------------------------------------- EOFError Traceback (most recent call last) /tmp/ipykernel_8405/3858244629.py in ----> 1 df = pd.read_pickle("file.pickle") ~/miniconda3/envs/ai/lib/python3.8/site-packages/pandas/io/pickle.py in read_pickle(filepath_or_buffer, compression, storage_options) 215 # RawIOBase, BufferedIOBase, TextIOBase, TextIOWrapper, mmap]"; 216 # expected "IO[bytes]" --> 217 return pickle.load(handles.handle) # type: ignore[arg-type] 218 except excs_to_catch: 219 # e.g. EOFError: Ran out of input
核心原因分析
- 工作目录不一致:Jupyter Notebook的默认工作目录和Shell当前目录不同,导致读取的是一个空文件或同名的其他无效文件(空文件会直接触发EOFError)
- 文件读取异常:Jupyter进程对目标pickle文件的读取权限不足,或者读取时文件被其他进程占用、截断,导致读取内容不完整
- 内核环境缓存:Jupyter内核未正确加载
ai环境的依赖,或pickle/pandas模块存在隐性版本差异(虽然环境名称相同,但内核可能缓存了旧版本依赖) - 内存限制并非诱因:67M文件远低于Jupyter默认内存阈值,不会因内存不足触发该错误
排查与解决步骤
- 确认工作目录:在Notebook中执行以下命令查看当前工作目录,对比Shell中
pwd的输出:
若目录不一致,使用文件绝对路径读取:!pwdimport pandas as pd # 替换为你的文件绝对路径 df = pd.read_pickle("/full/path/to/your/file.pickle") - 验证文件完整性:在Notebook中检查文件大小,确认是否为67M:
若文件远小于预期,说明读取了错误文件,需修正路径!ls -lh file.pickle - 重置Jupyter内核:关闭当前Notebook的内核,重新启动后再次尝试读取,可解决内核缓存导致的环境异常
- 检查文件权限:查看文件权限,确保Jupyter运行用户有读取权限:
若权限不足,添加读取权限:!ls -l file.pickle!chmod +r file.pickle - 重新生成Pickle文件:若上述步骤无效,在Shell中重新导出文件后再尝试读取:
# Shell中执行 df = pd.read_pickle("file.pickle") df.to_pickle("file_fixed.pickle")
内容的提问来源于stack exchange,提问作者Antonio Sesto
相关产品推荐
相关产品推荐

