加载pickle文件时出现‘int object is not callable’错误如何解决?
解决Pickle加载报错:TypeError: 'int' object is not callable
问题场景
拿到科研团队提供的theFile.p pickle文件,执行以下代码加载时触发错误:
opened_file = open("theFile.p", "rb") loaded_data = pickle.load(opened_file)
错误信息:
loaded_data = pickle.load(opened_file) ^^^^^^^^^^^^^^^^^^^^^ TypeError: 'int' object is not callable
完整回溯:
Traceback (most recent call last): File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py", line 1499, in _exec pydev_imports.execfile(file, globals, locals) # execute the script ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "/Users/NAME/Desktop/Todo/Test/main.py", line 12, in <module> main() File "/Users/NAME/Desktop/Todo/Test/main.py", line 7, in main loaded_file = pickle.load(opened_file) ^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: 'int' object is not callable
已知该错误常见于变量名与内置函数重名,但需要排查是否为文件本身问题或Python版本兼容导致,以下是具体调试方案:
调试排查步骤
1. 优先排查变量重名问题
报错核心是pickle.load被覆盖成了整数类型,先检查代码中是否有以下类似操作:
- 直接赋值
pickle = 123或load = 456 - 导入时被覆盖,比如
from some_module import pickle
验证方法:在调用pickle.load前添加一行代码:
print(type(pickle.load))
如果输出为<class 'int'>,说明确实存在重名覆盖,找到代码中覆盖该函数的位置并修改变量名。
2. 检查文件完整性
- 查看文件大小:如果文件大小为0KB或远小于预期,说明文件传输过程中损坏或未完整获取,联系团队重新发送。
- 用pickletools解析文件:Python内置的
pickletools可以检查pickle文件的结构,执行以下命令:
如果能输出正常的pickle指令序列,说明文件结构合法;如果输出乱码或解析报错,判定文件损坏。python -m pickletools theFile.p
3. 验证Python版本兼容性
- 跨Python2/3兼容:若文件由Python2生成,Python3加载时需指定编码参数:
with open("theFile.p", "rb") as f: loaded_data = pickle.load(f, encoding='latin1') # 或encoding='bytes' - Python3小版本差异:虽然Python3各小版本pickle兼容性较好,但部分旧格式可能存在兼容问题,可尝试添加
fix_imports=True参数:
也可以尝试用生成该文件的Python版本(比如团队使用的3.8/3.9)加载测试。with open("theFile.p", "rb") as f: loaded_data = pickle.load(f, fix_imports=True)
4. 其他调试技巧
- 捕获异常细节:用
try-except捕获更多错误信息:import pickle import traceback try: with open("theFile.p", "rb") as f: loaded_data = pickle.load(f) except Exception as e: print(f"错误详情: {str(e)}") traceback.print_exc() - 尝试joblib加载:科研场景中常使用
joblib替代pickle存储大文件,可尝试:import joblib loaded_data = joblib.load("theFile.p")
内容的提问来源于stack exchange,提问作者Andrew Jones
相关产品推荐
相关产品推荐

