MNE Python中.mff文件夹与CSV文件路径定位失败问题求助
问题:加载EEG数据时触发FileNotFoundError
我正在使用MNE Python分析感觉诱发电位,电脑中存储着文件夹形式的.mff原始EEG数据,以及记录刺激时长的CSV文件。在预处理阶段加载这两类文件时,出现了以下错误:
Traceback (most recent call last) Cell In[19], line 20 11 report.add_code('01-seps.py', title='Code') 13 # Load raw data 14 # raw = mne.io.read_raw_egi(eeg_file) 15 16 # behav = pd.read_csv(dur_file) 17 18 # # Get EEG data and durations 19 eeg_file = opj(basepath, p, 'sub', ---> 20 [f for f in os.listdir(opj(basepath, p, 'sub')) if '.mff' in f][0]) 22 dur_file = opj(basepath, p, 'sub', 23 [f for f in os.listdir(opj(basepath, p, 'sub')) if 'durations' in f][0]) FileNotFoundError: [WinError 3] The system cannot find the path specified: 'D:\\test\\data\\sub-041_20240129_114214.mff\\sub'
我的代码如下:
#path basepath = 'D:\\test\\data' derivpath = 'D:\\test\\derivpath' if not os.path.exists(derivpath): os.mkdir(derivpath) #get the participants parts = [s for s in os.listdir(basepath) if 'sub-' in s] parts.sort() visual_inspect = False #SEP task all_evoked = [] for p in parts: if not os.path.exists(opj(derivpath, p)): os.mkdir(opj(derivpath, p)) # Initialize report report = Report(verbose=False, subject=p, title='SEP report for part ' + p) report.add_code('01-seps.py', title='Code') # Get EEG data and durations eeg_file = opj(basepath, p, 'sep', [f for f in os.listdir(opj(basepath, p, 'sep')) if '.mff' in f][0]) dur_file = opj(basepath, p, 'sep', [f for f in os.listdir(opj(basepath, p, 'sep')) if 'durations' in f][0])
错误原因
从报错路径D:\\test\\data\\sub-041_20240129_114214.mff\\sub可以看出:你的parts列表错误地将后缀为.mff的文件识别成了参与者文件夹,导致后续拼接路径时,试图在这个.mff文件内部寻找sub(或代码中的sep)子文件夹,而这个路径根本不存在。
解决方案
1. 修正参与者文件夹的筛选逻辑
修改parts的生成代码,只筛选basepath下包含sub-的文件夹,排除掉.mff这类文件:
parts = [s for s in os.listdir(basepath) if 'sub-' in s and os.path.isdir(os.path.join(basepath, s))] parts.sort()
2. 匹配实际文件路径结构
确认你的文件存储结构:
- 如果.mff和CSV文件直接放在参与者文件夹(如
sub-041_20240129_114214)下,而非sep子文件夹中,需要移除路径中的sep层级:
# 获取EEG数据和时长文件 mff_files = [f for f in os.listdir(opj(basepath, p)) if '.mff' in f] if not mff_files: print(f"未找到参与者{p}的.mff文件,跳过") continue eeg_file = opj(basepath, p, mff_files[0]) dur_files = [f for f in os.listdir(opj(basepath, p)) if 'durations' in f] if not dur_files: print(f"未找到参与者{p}的时长CSV文件,跳过") continue dur_file = opj(basepath, p, dur_files[0])
额外优化建议
避免直接用[0]取列表第一个元素,先判断列表是否为空,防止出现索引越界错误,上面的代码已经加入了这个判断逻辑。
内容的提问来源于stack exchange,提问作者Pouya Rabiei
相关产品推荐
相关产品推荐

