从压缩文件中读取matlab文件(* .mat),而不是在Python中解压缩到目录

时间:2012-06-19 17:10:20

标签: 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

对于处理数据的任何其他建议表示赞赏。

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

解决方案:以MATF格式保存数据,即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 FTW!

答案 1 :(得分:0)

在我的一个冻结应用程序中,我们将一些文件捆绑到py2exe创建的.bin文件中,然后将它们拉出来:

z = zipfile.ZipFile(os.path.join(myDir, 'common.bin'))

data = z.read('schema-new.sql')

我不确定是否会将.mat文件提供给scipy,但我认为值得一试。