1. ホーム
  2. python

[解決済み] np.load()はopenと一緒にする必要があります。

2022-01-30 18:54:52

質問

従来、pythonでは1ユーザー 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 コンテキストを閉じるのですか?

解決方法は?

現在の作業ディレクトリからランダムなファイルを使用する。

使用方法 with を使用し npz :

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 は配列なので、quot;close" にはできません。

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)

を使おうとすると npy のロードを with は動作しません。 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__