如何使用 scipy.io.savemat 附加到 .mat 文件?
How to append to .mat file using scipy.io.savemat?
所以当我使用 savemat 命令时,它往往会覆盖文件。有没有可能的方法来追加而不是覆盖?我知道解决方法是将所有内容放入列表中,然后将其转换为字典。这对我不起作用,因为我正在努力提高 RAM 效率。在网上搜索我发现了这个 How NOT to overwrite the .mat file when using scipy.io.savemat()?
这也行不通,因为它涉及到在您的 ram 内存中提取一个数据文件以在每个循环中附加它,从速度的角度来看这似乎很愚蠢。
我考虑过附加到一个 numpy 二进制文件,然后将其拉入并保存到 .mat 文件?我不确定这是否比第一个选项更有效。
谢谢!
根据 savemat
文档:
file_name : str or file-like object
所以你可以以附加模式打开文件,然后写入,例如
io.savemat('temp.mat',{'data':np.ones(10)}) # write
with open('temp.mat','ab') as f:
io.savemat(f, {'newdata':np.arange(5)}) # append
print io.loadmat('temp.mat').keys() # read
# dict_keys(['data', '__globals__', 'newdata', '__header__', '__version__'])
或完整描述:
{'data': array([[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]),
'__globals__': [],
'newdata': array([[0, 1, 2, 3, 4]]),
'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Fri Mar 13 14:14:33 2015',
'__version__': '1.0'}
https://github.com/scipy/scipy/blob/master/scipy/io/matlab/mio5.py#L34 中的注释表明当数据文件中有函数时追加会出现问题,但这表明如果我们只是保存数组则追加不是问题。但也许需要进一步搜索 scipy
问题。
它只适用于一次追加!如果追加两次,Matlab 会报错"File might be currupt"。
scipy.io.savemat('temp.mat',{'data':np.ones(10)}) # write
with open('temp.mat','ab') as f:
scipy.io.savemat(f, {'newdata1':np.arange(5)}) # append
with open('temp.mat','ab') as f:
scipy.io.savemat(f, {'newdata2':np.arange(5)}) # append
如果您需要附加大量数据,另一个选项是下一个:
self.upload1 = sio.loadmat(self.namedir,self.params)
sio.savemat('params_lo.mat', self.upload1)
使用此表单加载数据并添加新变量。要小心,因为如果它们具有相同的名称,则不会更改其值。因此,为了更正此问题,我删除了所有要更改的变量。
self.upload = sio.loadmat(self.namedir)
for i in self.str_vars:
try:
del self.upload[i]
except:
continue
sio.savemat('params_lo.mat', self.upload)
self.upload1 = sio.loadmat(self.namedir,self.params)
sio.savemat('params_lo.mat', self.upload1)
所以当我使用 savemat 命令时,它往往会覆盖文件。有没有可能的方法来追加而不是覆盖?我知道解决方法是将所有内容放入列表中,然后将其转换为字典。这对我不起作用,因为我正在努力提高 RAM 效率。在网上搜索我发现了这个 How NOT to overwrite the .mat file when using scipy.io.savemat()?
这也行不通,因为它涉及到在您的 ram 内存中提取一个数据文件以在每个循环中附加它,从速度的角度来看这似乎很愚蠢。
我考虑过附加到一个 numpy 二进制文件,然后将其拉入并保存到 .mat 文件?我不确定这是否比第一个选项更有效。
谢谢!
根据 savemat
文档:
file_name : str or file-like object
所以你可以以附加模式打开文件,然后写入,例如
io.savemat('temp.mat',{'data':np.ones(10)}) # write
with open('temp.mat','ab') as f:
io.savemat(f, {'newdata':np.arange(5)}) # append
print io.loadmat('temp.mat').keys() # read
# dict_keys(['data', '__globals__', 'newdata', '__header__', '__version__'])
或完整描述:
{'data': array([[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]),
'__globals__': [],
'newdata': array([[0, 1, 2, 3, 4]]),
'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Fri Mar 13 14:14:33 2015',
'__version__': '1.0'}
https://github.com/scipy/scipy/blob/master/scipy/io/matlab/mio5.py#L34 中的注释表明当数据文件中有函数时追加会出现问题,但这表明如果我们只是保存数组则追加不是问题。但也许需要进一步搜索 scipy
问题。
它只适用于一次追加!如果追加两次,Matlab 会报错"File might be currupt"。
scipy.io.savemat('temp.mat',{'data':np.ones(10)}) # write
with open('temp.mat','ab') as f:
scipy.io.savemat(f, {'newdata1':np.arange(5)}) # append
with open('temp.mat','ab') as f:
scipy.io.savemat(f, {'newdata2':np.arange(5)}) # append
如果您需要附加大量数据,另一个选项是下一个:
self.upload1 = sio.loadmat(self.namedir,self.params)
sio.savemat('params_lo.mat', self.upload1)
使用此表单加载数据并添加新变量。要小心,因为如果它们具有相同的名称,则不会更改其值。因此,为了更正此问题,我删除了所有要更改的变量。
self.upload = sio.loadmat(self.namedir)
for i in self.str_vars:
try:
del self.upload[i]
except:
continue
sio.savemat('params_lo.mat', self.upload)
self.upload1 = sio.loadmat(self.namedir,self.params)
sio.savemat('params_lo.mat', self.upload1)