python - 从压缩文件中读取 matlab 文件 (*.mat) 而无需解压缩到 Python 中的目录

标签 python matlab zip

这个具体问题源于尝试处理由 MATLAB 算法生成的大型数据集,以便我可以使用 python 算法处理它们。

背景: 我在 MATLAB 中有大型数组(通常为 20x20x40x15000 [i,j,k,frame]),我想在 python 中使用它们。所以我将数组保存到一个 *.mat 文件并使用 scipy.io.loadmat(fname) 将 *.mat 文件读入一个 numpy 数组。但是,出现了一个问题,如果我尝试在 python 中加载整个 *.mat 文件,则会发生内存错误。为了解决这个问题,我将 *.mat 文件分成几部分,这样我就可以一次将这些部分加载到一个 python 数组中。如果我按帧划分 *.mat,我现在有 15,000 个 *.mat 文件,使用起来很快就会很痛苦(至少在 Windows 中是这样)。所以我的解决方案是使用压缩文件。

问题:我可以使用 scipy 直接从压缩文件中读取 *.mat 文件,而无需先将文件解压缩到当前工作目录吗?

规范:Python 2.7,windows xp

当前代码:

import scipy.io
import zipfile
import numpy as np

def readZip(zfilename,dim,frames):
    data=np.zeros((dim[0],dim[1],dim[2],frames),dtype=np.float32)
    zfile = zipfile.ZipFile( zfilename, "r" )
    i=0
    for info in zfile.infolist():
        fname = info.filename
        zfile.extract(fname)
        mat=scipy.io.loadmat(fname)
        data[:,:,:,i]=mat['export']
        mat.clear()
        i=i+1
    return data

尝试过的代码:

mat=scipy.io.loadmat(zfile.read(fname))

产生此错误:

TypeError: file() argument 1 must be encoded string without NULL bytes, not str

mat=scipy.io.loadmat(zfile.open(fname))

产生此错误:

fileobj.seek(0)
UnsupportedOperation: seek

如有任何其他有关处理数据的建议,我们将不胜感激。

谢谢!

最佳答案

我很确定我的问题的答案是,并且有更好的方法可以完成我想做的事情。

无论如何,根据 J.F. Sebastian 的建议,我设计了一个解决方案。

解决方案:将MATLAB中的数据保存为HDF5格式,即hdf5write(fname, '/data', data_variable)。这会生成一个 *.h5 文件,然后可以通过 h5py 将其读入 python。 .

python代码:

import h5py

r = h5py.File(fname, 'r+')
data = r['data']

我现在可以直接对数据进行索引,但数据仍保留在硬盘上。

print data[:,:,:,1]

或者我可以将它加载到内存中。

data_mem = data[:]

然而,这又一次给出了内存错误。因此,为了将其存入内存,我可以遍历每一帧并将其添加到一个 numpy 数组中。

h5py 好吧!

关于python - 从压缩文件中读取 matlab 文件 (*.mat) 而无需解压缩到 Python 中的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11105931/

相关文章:

python - 翻译时停用语言回退(Python Django i18n)

c - 为什么 cudaMalloc 返回非法内存访问

c++ - OpenCV idft() 和 MATLAB ifft2 的结果不匹配

gradle - Gradle任务创建目录的zip存档

Spring - 下载文件并重定向

python - 如何、何时以及在 python 中向量化什么?

python - 读取 CSV 文件并确定数据结构

python - 存储用户移动位置的最佳数据库,优先考虑读写速度?

matlab - 使用此格式导出矩阵 MATLAB

cocoa - 使用 NSTask 创建 zip 存档,其中包含包含文件的第一级文件夹