matlab 如何在python中从一个文件夹中读取多个.mat文件?

new9mtju  于 2023-01-09  发布在  Matlab
关注(0)|答案(2)|浏览(284)

我尝试在python中读取多个. mat文件。每次我都得到错误。这是我的代码:

folder = "C:/Users/Sreeraj/Desktop/Me/PhD/Mahindra/brain_tumor_dataset/data/"
directs = sorted(listdir(folder))
labels = []
for file in directs:
    f = h5py.File(folder+file,'r')
    label = np.array(f.get("cjdata/label"))[0][0]
    labels.append(label)
labels = pd.Series(labels)
labels.shape

我得到的错误是:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-11-e7d73f54f73d> in <module>
      3 labels = []
      4 for file in directs:
----> 5     f = h5py.File(folder+file,'r')
      6     label = np.array(f.get("cjdata/label"))[0][0]
      7     labels.append(label)

~\miniconda3\envs\tensorflow\lib\site-packages\h5py\_hl\files.py in __init__(self, name, mode, driver, libver, userblock_size, swmr, rdcc_nslots, rdcc_nbytes, rdcc_w0, track_order, **kwds)
    404             with phil:
    405                 fapl = make_fapl(driver, libver, rdcc_nslots, rdcc_nbytes, rdcc_w0, **kwds)
--> 406                 fid = make_fid(name, mode, userblock_size,
    407                                fapl, fcpl=make_fcpl(track_order=track_order),
    408                                swmr=swmr)

~\miniconda3\envs\tensorflow\lib\site-packages\h5py\_hl\files.py in make_fid(name, mode, userblock_size, fapl, fcpl, swmr)
    171         if swmr and swmr_support:
    172             flags |= h5f.ACC_SWMR_READ
--> 173         fid = h5f.open(name, flags, fapl=fapl)
    174     elif mode == 'r+':
    175         fid = h5f.open(name, h5f.ACC_RDWR, fapl=fapl)

h5py\_objects.pyx in h5py._objects.with_phil.wrapper()

h5py\_objects.pyx in h5py._objects.with_phil.wrapper()

h5py\h5f.pyx in h5py.h5f.open()

OSError: Unable to open file (file signature not found)

我有5849个垫子文件,谁能告诉我哪里出错了?
我使用h5py来读取mat文件。我想读取每个. mat文件中的标签和图像。

9rbhqvlz

9rbhqvlz1#

我认为问题出在连接folder+file上。这有两点:
1.单词file是一个python关键字,所以你不应该用它作为变量名。
1.假设这里使用的是os.listdir(没有附加导入本身),那么文件夹和文件的连接缺少一个斜杠。

修复此问题(在我将file重命名为filename之后):

full_file_path = os.path.join(folder, filename)
f = h5py.File(full_file_path,'r')
flseospp

flseospp2#

我这里有4个领域的代码可以改进:
1.我更喜欢用glob.iglob()方法来获取文件列表。它可以使用通配符来定义文件名,并且是一个生成器。这样你就不必创建一个包含5849个文件名的列表。
1.用h5py.File()打开文件,但不关闭它。这可能不会导致问题,但却是一个糟糕的做法。最好使用Python的with/as:上下文管理器。(如果不这样做,请在循环中添加f.close())。
1.您正在使用数据集.get()方法检索数据集对象。该方法已过时很长时间。记录的做法是引用数据集名称,如下所示f["cjdata/label"]
1.此外,您在数据集对象后添加了[0][0]。是否确实要执行此操作?它们是将访问index= [0][0]处的数据集值的索引。如果要创建数据集值的numpy数组,请使用label = f[“cjdata/label”][()]
已修改代码,演示了以下所有更改:

folder = "C:/Users/Sreeraj/Desktop/Me/PhD/Mahindra/brain_tumor_dataset/data/"
file_wc = folder + "*.mat"  # assumes filename extension is .mat
labels = []
for fname in glob.iglob(file_wc):
    with h5py.File(fname,'r') as f:
        # dataset .get() method deprecated, line below updated appropriately:
        label = np.array(f["cjdata/label"][0][0])
        #or maybe just:
        label = f["cjdata/label"][()]
        labels.append(label)
labels = pd.Series(labels)
labels.shape

相关问题