【问题标题】:How to append to .mat file using scipy.io.savemat?如何使用 scipy.io.savemat 附加到 .mat 文件?
【发布时间】:2020-11-12 20:24:46
【问题描述】:

所以当我使用 savemat 命令时,它往往会覆盖文件。有没有一种可能的方法来追加而不是覆盖?我知道解决方法是将所有内容放入列表中,然后将其转换为字典。这对我不起作用,因为我正在努力提高 RAM 效率。在网上搜索我找到了这个How NOT to overwrite the .mat file when using scipy.io.savemat()?

这也行不通,因为它涉及在您的 ram 内存中拉取一个数据文件以在每个循环中附加它,从速度的角度来看这似乎很愚蠢。

我想过附加到一个 numpy 二进制文件,然后将其拉入并将其保存到 .mat 文件中?我不确定这是否会比第一个选项更高效。

谢谢!

【问题讨论】:

  • 是向文件添加新变量,还是向现有变量添加值?这个“每一个循环”是怎么回事?您是否尝试以增量方式将数据写入文件?

标签: python numpy scipy


【解决方案1】:

根据savemat docs:

file_name : str 或类似文件的对象

所以你可以以追加模式打开文件,并写入,例如

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 问题。

【讨论】:

  • 它会创建文件,但由于某种原因我无法加载它。我得到一个 TypeError: Expecting miINT32 as data type。您可以将数据附加到同一个字典键。但是你不能用新数据附加新的字典键,这就是我想要做的。我会将其标记为答案,因为它回答了我的问题但没有解决我的问题
  • 我基本上可以使用建议的方法。但是,如果文件中已经存在特定的变量名,则文件将变得不可读。
  • 是的,我做了一个测试,当有多个相同的键时,你会得到 TypeError: Expecting miINT32 错误
  • 此处解决方案中的示例运行良好。当我在自己的 numpy 数组上使用它时,我在尝试读取(保存后)时得到 ValueError: Did not read any bytes
【解决方案2】:

它只适用于一次追加!如果您追加两次,Matlab 会给出错误“文件可能已损坏”。

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

【讨论】:

    【解决方案3】:

    如果您需要附加大量数据,另一个选项是下一个:

    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)
    

    【讨论】:

      猜你喜欢
      • 2015-01-13
      • 2011-01-09
      • 2012-01-20
      • 2017-09-28
      • 2015-06-20
      • 1970-01-01
      • 2010-10-07
      • 2022-10-24
      • 2019-07-04
      相关资源
      最近更新 更多