Python:如何关闭mat文件?

时间:2016-05-19 07:04:58

标签: python matlab python-2.7

我正在从20k mat文件中读取数据到数组中。 在阅读了大约13k个文件后,该过程以“Killed”消息结束。 显然,看起来问题是打开的文件太多了。 我试图找出如何在Python中显式“关闭”mat文件,但除了savemat之外没有找到任何文件,这不是我在这种情况下所需要的。

如何在python中显式关闭mat文件?

import scipy.io
x=[]
with open('mat_list.txt','r') as f:
    for l in f:
            l=l.replace('\n','')
            mat = scipy.io.loadmat(l)
            x.append(mat['data'])

2 个答案:

答案 0 :(得分:3)

你不需要。 loadmat不会保持文件打开状态。如果给定文件名,它会将文件内容加载到内存中,然后立即关闭它。您可以使用@ nils-werner建议的文件对象,但这样做不会带来任何好处。您可以通过查看source code来查看此内容。

由于一次只有太多数据,您很可能内存不足。我要尝试的第一件事是将所有数据加载到一个大的numpy数组中。您知道每个文件的大小,并且知道有多少文件,因此您可以预先分配正确大小的数组并将数据写入该数组的切片。如果这是您的阵列大小的问题,这也会立即告诉您。

如果您的内存不足,则需要其他解决方案。一个简单的解决方案是使用dask。这允许您创建看起来像numpy数组的东西,但它存在于文件而不是内存中。这允许您处理太大而无法放入内存的数据集。 bcolzblaze提供类似的功能,但不是无缝的。

如果这些不是一个选项,h5pypytables允许您逐步将数据集存储到文件中,而不是必须立即将整个内容保存在内存中。

总的来说,我认为这个问题是XY Problem的典型例子。通常要更好地陈述您的症状,并就这些症状寻求帮助,而不是猜测解决方案是什么,并要求某人帮助您实施解决方案。

答案 1 :(得分:1)

您可以将打开的文件句柄传递给import scipy.io x=[] with open('mat_list.txt','r') as f: for l in f: l=l.replace('\n','') with open(l, 'r') as matfile: mat = scipy.io.loadmat(matfile) x.append(mat['data'])

with open()

离开Public myGlobalVariable As String Private Sub Workbook_Open() 'Ask the user for the value of the global variable myGlobalVariable = InputBox("Give me some input", "Hi", 1) End Sub 上下文将自动关闭文件。