如何使用python通过for循环将许多.npz文件转换为.mat文件



我需要使用python将许多.npz文件转换为.mat文件。我的文件排列为datafile1.npz、datafile2.npz…等。我想将这些文件转换为datafile_1.mat、datafile_2.mat文件等。到目前为止,我写了一个代码,但得到了错误AttributeError:"str"对象没有属性"items"。。。为什么我不能理解这个错误。我希望有人能帮忙。

import numpy as np
import scipy.io
import glob
filpath=glob.glob('./datafile_*.npz')
for file in filpath:
#data = np.load('file',)
scipy.io.savemat('filepath'+'.mat', mdict=file)
print(data)


使用来自早期SO:的npz

In [491]: data = np.load('test.npz')                                                                 
In [492]: list(data.keys())                                                                          
Out[492]: ['arr_0', 'arr_1', 'arr_2']
In [493]: data['arr_0']                                                                              
Out[493]: 
array([[1., 1., 1.],
[1., 1., 1.]])
In [494]: data['arr_1']                                                                              
Out[494]: 
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
In [495]: data['arr_2']                                                                              
Out[495]: 
array([[ 0,  1,  2,  3,  4,  5],
[ 6,  7,  8,  9, 10, 11]])

CCD_ 2是类似于CCD_ 3的对象。因此,它实际上可以作为mdict参数传递给savemat(它也需要一个dict(:

In [496]: io.savemat('data.dat', data)         

测试保存:

In [497]: io.loadmat('data.dat')                                                                     
Out[497]: 
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sun Aug  2 17:16:18 2020',
'__version__': '1.0',
'__globals__': [],
'arr_0': array([[1., 1., 1.],
[1., 1., 1.]]),
'arr_1': array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]),
'arr_2': array([[ 0,  1,  2,  3,  4,  5],
[ 6,  7,  8,  9, 10, 11]])}

或者我们可以制作我们自己的dict

In [498]: io.savemat('data.dat', mdict={'x':data['arr_0'], 'y':data['arr_1']})                       
In [499]: io.loadmat('data.dat')                                                                     
Out[499]: 
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sun Aug  2 17:19:06 2020',
'__version__': '1.0',
'__globals__': [],
'x': array([[1., 1., 1.],
[1., 1., 1.]]),
'y': array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])}

关键是要理解npznp.load返回dict,我们可以从中加载实际的数组。这个dict本身并不是数据。类似地,CCD_ 10期望阵列的CCD_。由于两者都使用dict,所以我们不必显式地加载数组。

相关内容

  • 没有找到相关文章