You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

np.load()读取文件是否需要配合with上下文保证文件自动关闭?

结论先行:是否自动关闭文件取决于你读取的格式,不能一概而论

  • 读取.npy、普通pickle等非npz格式文件时:直接调用a = np.load()会在数据完全加载到内存后自动关闭文件,和with上下文管理的效果一致,不会遗留文件句柄。
    原因是这类格式的读取逻辑是一次性把全量数据载入内存,读取完成后底层会立即释放对应的文件资源,不需要额外操作。
  • 读取.npz格式文件时:直接调用np.load()不会自动立即关闭文件,只有当返回的NpzFile对象被垃圾回收时,才会触发文件关闭。
    原因是npz是压缩包格式,np.load默认采用懒加载机制:不会一次性把所有数组读入内存,只有当你通过data['key']访问对应数组时才会实际读取内容,因此文件句柄会一直被NpzFile对象持有。如果程序运行周期长、或者打开的npz文件很多,很容易出现文件资源泄漏,在Windows系统上甚至会出现文件被占用无法删除/修改的问题。

补充说明:为什么只有npz格式支持with写法

因为只有NpzFile类实现了上下文管理器协议的__enter__和__exit__方法,读取其他格式返回的numpy数组本身没有实现上下文管理的相关方法,自然不能放在with语句里使用。

如果不想用with读npz,也可以手动调用close()方法主动关闭文件:

data = np.load('test.npz')
a = data['a']
data.close() # 手动释放文件资源

内容的提问来源于stack exchange,提问作者theastronomist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:30:04