np.load()应该在with with open中



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

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

在numpy文档中显示了np.loadwith load

with load('foo.npz') as data:
a = data['a']
a = np.load('/tmp/123.npy')

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

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

使用withnpz:

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

使用"普通"负载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__

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

您可以通过调用:

来使用with上下文管理器和npz和npy
with np.load('foo.npz', allow_pickle=True) as data:
a = data['a']

与npy文件相同。

最新更新