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
相关产品推荐
相关产品推荐

