使用上下文管理器复制Tensorflow-__enter__和__exit__错误

时间:2018-11-24 23:38:10

标签: python python-3.x numpy tensorflow tensorflow-datasets

我尝试将numpy.load('file.npy')用作栏,但它给我一个error错误:_enter__,以及另一个时间attributeError:_exit__。我只是想复制Tensorflow页面上显示的示例所做的事情。我不明白为什么他们的代码会起作用,但是我的-应该是相同的-不会。

my attempt

Tensorflow pic

1 个答案:

答案 0 :(得分:0)

In [29]: f = open('con.npy')
In [30]: f.__enter__
Out[30]: <function TextIOWrapper.__enter__>
In [31]: f.__exit__
Out[31]: <function TextIOWrapper.__exit__>
In [32]: f.close()
In [33]: arr = np.load('con.npy')

arrndarray,没有__enter__方法。

npz文件是一个zip存档,确实具有__enter__。它应该在with中使用:

In [34]: ls *.npz
Mcoo.npz  Mcsr.npz  test.npz
In [35]: d = np.load('test.npz')
In [36]: d.__enter__
Out[36]: <bound method NpzFile.__enter__ of <numpy.lib.npyio.NpzFile object at 0x7fc5e03f7cf8>>

在{中使用npz

In [39]: with np.load('test.npz') as d:
    ...:     print(list(d.keys()))
    ...:     a = d['a']
    ...:     
['a', 'b']
In [40]: a
Out[40]: array(1)

通常,我们不必为with使用npz,因为挂在像对象这样的字典上是没有成本的(据我所知)。


在Tensorflow示例中,features = data['features']data是打开的NPZ归档文件一致。因此,尽管有npy,该load还是一个档案。区别基于文件本身(_ZIP_PREFIX)中的数据位,而不是文件名。

摘自load文档:

- If the file is a ``.npz`` file, the returned value supports the
  context manager protocol in a similar fashion to the open function::

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