"IsADirectoryError: [Errno 21] Is a directory: " 这是一个文件夹而不是文件。

34

我已经将数据分成测试集和训练集,放在不同的文件夹中。现在我需要加载病人的数据。每个病人有8个图像。

def load_dataset(root_dir, split):
    """
    load the data set numpy arrays saved by the preprocessing script
    :param root_dir: path to input data
    :param split: defines whether to load the training or test set
    :return: data: dictionary containing one dictionary ({'data', 'seg', 'pid'}) per patient
    """
    in_dir = os.path.join(root_dir, split)
    data_paths = [os.path.join(in_dir, f) for f in os.listdir(in_dir)]
    data_and_seg_arr = [np.load(ii, mmap_mode='r') for ii in data_paths]
    pids = [ii.split('/')[-1].split('.')[0] for ii in data_paths]
    data = OrderedDict()
    for ix, pid in enumerate(pids):
        data[pid] = {'data': data_and_seg_arr[ix][..., 0], 'seg': data_and_seg_arr[ix][..., 1], 'pid': pid}
    return data

但是,错误信息显示:

File "/home/zhe/Research/Seg/heart_seg/data_loader.py", line 61, in load_dataset
data_and_seg_arr = [np.load(ii, mmap_mode='r') for ii in data_paths]
File "/home/zhe/Research/Seg/heart_seg/data_loader.py", line 61, in <listcomp>
data_and_seg_arr = [np.load(ii, mmap_mode='r') for ii in data_paths]
File "/home/zhe/anaconda3/envs/tf_env/lib/python3.6/site-packages/numpy/lib/npyio.py", line 372, in load
fid = open(file, "rb")
IsADirectoryError: [Errno 21] Is a directory: './data/preprocessed_data/train/Patient009969'

已经是文件名了,不是目录。谢谢!


data_paths是一个目录。我希望加载Patient文件夹(data_paths)中的图像(data_and_seg_arr)。但错误显示data_paths应该是一个文件,而不是一个目录。 - Jo_
3个回答

17

看起来 ./data/preprocessed_data/train/Patient009969 是一个目录,而不是一个文件。

os.listdir() 返回的既有文件也有目录。

或许尝试使用 os.walk()。它会分别处理文件和目录,并可以递归进入子目录以迭代地查找更多文件:

data_paths = [os.path.join(pth, f) 
    for pth, dirs, files in os.walk(in_dir) for f in files]

非常感谢。我错了。data_paths是一个目录。我想要的是在Patient文件夹(data_paths)中加载image0~7(data_and_seg_arr)。但是错误显示data_paths应该是一个文件。 - Jo_
@Zhuo 如果你使用我回答中提供的代码,它应该可以工作。 - nosklo

9

您的路径中既有文件又有目录吗?os.listdir会列出文件和目录,因此当您尝试使用np.load打开目录时,它会产生错误。您可以仅筛选文件以避免该错误:

data_paths = [os.path.join(in_dir, f) for f in os.listdir(in_dir)]
data_paths = [i for i in data_paths if os.path.isfile(i)]

或者全部放在一行中:

data_paths = [i for i in (os.path.join(in_dir, f) for f in os.listdir(in_dir)) if os.path.isfile(i)]

非常感谢。我错了。data_paths是一个目录。我想要的是加载Patient文件夹(data_paths)中的图像(data_and_seg_arr)。但是错误显示data_paths应该是一个文件。 - Jo_

3

我曾经遇到了同样的问题,但我通过将我的路径从 Data/Train_Data/myDataset/(my images) 改为 Data/Train_Data/(my images) 来解决它,其中脚本python与Data处于同一路径中。 希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接