np.load() 应该在 with with open

Should np.load() be in with with open

传统上 python 一个用户 with 打开文件,这样当您退出内部范围时文件会自动关闭。

with open('file.pickle', 'rb') as f:
    data = pickle.load(f)

在 numpy documentation 中它同时显示 np.loadwith load

with load('foo.npz') as data:
    a = data['a']

a = np.load('/tmp/123.npy')

看起来 with 方法只适用于 .npz 文件。 a=np.load() 是否像 with 上下文关闭时一样自动关闭数据文件?

不,a=np.load() 不会自动关闭文件。您可以使用 a.close() 自行关闭它。事实上,如果你用 np.savez 保存了 .npz 文件,那么加载方法只会获取存档信息,但不会加载整个文件。因此,文件保持打开状态。

您可以通过调用以下命令将 with 上下文管理器与 npz 和 npy 一起使用:

with np.load('foo.npz', allow_pickle=True) as data:
      a = data['a']

同样适用于 npy 文件。

使用我当前工作目录中的随机文件:

使用 withnpz:

In [51]: with np.load('f.npz') as f:print(f['b'])
['q' 'r' 's']

使用 'plain' 加载 npy:

In [55]: a = np.load('adict.npy',allow_pickle=True)
In [56]: a
Out[56]: 
array({'#Ineligiblevets': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'test': 'one'},
      dtype=object)

a是一个数组,所以不能“关闭”:

In [57]: a.close()
Traceback (most recent call last):
  File "<ipython-input-57-3980b52f6377>", line 1, in <module>
    a.close()
AttributeError: 'numpy.ndarray' object has no attribute 'close'

可以预先 open 文件,然后通过 with 传递,但是你必须正确设置模式,所以它真的没有帮助(除非你正在做某事特殊):

In [59]: with open('adict.npy', 'rb') as f:
    ...:     a = np.load(f, allow_pickle=True)
    ...: 
In [60]: a
Out[60]: 
array({'#Ineligiblevets': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'test': 'one'},
      dtype=object)

尝试在 with 中使用 npy 加载无效,因为 array 没有必需的 enter/exit 方法:

In [61]: with np.load('adict.npy', allow_pickle=True) as data: a=data
Traceback (most recent call last):
  File "<ipython-input-61-1025c4c8c4a8>", line 1, in <module>
    with np.load('adict.npy', allow_pickle=True) as data: a=data
AttributeError: __enter__