我尝试在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文件中的标签和图像。
2条答案
按热度按时间9rbhqvlz1#
我认为问题出在连接
folder+file
上。这有两点:1.单词
file
是一个python关键字,所以你不应该用它作为变量名。1.假设这里使用的是
os.listdir
(没有附加导入本身),那么文件夹和文件的连接缺少一个斜杠。修复此问题(在我将
file
重命名为filename
之后):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”][()]已修改代码,演示了以下所有更改: