如何将数据写入.npz文件而不删除以前的数据?
我正在使用python numpy包,我使用savez()来保存变量。
但是,每次我将信息保存到文件时,都会删除以前的信息。例如,假设我有
savez('file',a=a)
然后如果我使用
savez('file',b=b)
它将删除整个文件和
load('file.npz').keys()
只会返回'b'。
有没有选项可以简单地将变量“追加”到文件中删除文件?即,有没有办法简单地添加像'append=true'
这样的参数,以便它
savez('file',b=b,'append=true')
不会删除“a”?
答案 0 :(得分:1)
np.savez
创建一个zip存档。虽然可以在追加模式下打开这样的存档,但savez
不提供该选项(即,它没有记录,也没有隐藏代码)。
但是savez
使用np.save
创建了组件文件(从技术上讲,几个调用级别已关闭),并将它们打包在zip
中。所以我们可以自己做。
In [744]: import zipfile
In [746]: a=np.arange(10)
In [747]: b=np.zeros((10,10))
In [748]: np.savez('test.npz', a=a, b=b)
使用zipfile
或操作系统工具查看存档:
In [750]: f = zipfile.ZipFile('test.npz', mode='a') # note append mode
In [751]: f.infolist()
Out[751]:
[<ZipInfo filename='b.npy' filemode='-rw-------' file_size=928>,
<ZipInfo filename='a.npy' filemode='-rw-------' file_size=168>]
现在save
另一个数组,并使用zipfile
write
:
In [752]: np.save('c.npy',np.ones((2,3)))
In [753]: f.write('c.npy')
In [754]: f.infolist()
Out[754]:
[<ZipInfo filename='b.npy' filemode='-rw-------' file_size=928>,
<ZipInfo filename='a.npy' filemode='-rw-------' file_size=168>,
<ZipInfo filename='c.npy' filemode='-rw-rw-r--' file_size=176>]
In [755]: f.close()
使用load
进行测试:
In [757]: d = np.load('test.npz')
In [758]: list(d.keys())
Out[758]: ['b', 'a', 'c']
In [759]: d['c']
Out[759]:
array([[1., 1., 1.],
[1., 1., 1.]])
因此在初始调用中添加了a
和b
,而稍后添加了c
。目录中仍存在c.npy
文件。这可以删除。
简而言之,np.savez
是一种通过一次调用保存多个数组的简单方法。使用zipfile
时,它无法直接访问其所有灵活性,例如附加或更新文件。如果您需要这种灵活性,请直接使用np.save
和zipfile
。
答案 1 :(得分:0)
np.savez_compressed()允许将多个数组保存为压缩.npz
格式的单个文件:
np.savez_compressed('/path/to/file.npz',a=a, b=b)