python中的OS功能可读取文件

问题描述

我的文件夹结构如下所示

MA/valid/wrist/pa/positive/image2.png

基本上,每个腕部都有多个pa,每个pa都有正或负的检查,并且每个检查最多有3张png格式的图像。

我在下面编写了代码,但仅下降到pa级别,它不加载我的图像文件。加载我的图像文件的任何帮助将不胜感激。

def load(Pic_Dir,imsize):
   
    data = []
    dirs = next(os.walk(Pic_Dir))[1]

    for dir_name in dirs:

        files = next(os.walk(os.path.join(Pic_Dir,dir_name)))[2]
        print("load [",len(files),"] files from [",dir_name,"] " )
        for i in range(len(files)):
          image_name = files[i]
          image_path = os.path.join(Pic_Dir,image_name)
          
          label = dir_name

          img = cv2.imread(image_path)
          img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
          img = cv2.resize(img,(imsize,imsize))

          data.append([np.array(img),label])

    return 

函数通过以下行调用

data=load("/Users/bond/MA/train/XR_WRIST",244)

解决方法

我不确定我是否很好地理解了您的问题。但是,如果您需要遍历目录并处理其子目录中的所有图像文件,建议您编写如下内容:

def load(root_director,Imsize):
    import os
    #TODO:You need to figure out how to get a list of this pa. 
    #     Your question is not clear on how to get here
    pas =get_list_of_pa()
    cases =["positive","negative"]
    for pa in pas:
        for case in cases:
            in_dir = os.path.join(root_directory,pa,case)
            all_images = [f for f in os.listdir(in_dir) if f.endswith('.png')]
            for image in all_images:
                #Do your processing here
                pass

基本上,正如您所说,如果您有很多pa(什么是pa?),则首先需要获取所有pas的列表,然后遍历每个pas来访问cases=["positive","negative]的列表。这不是最佳的。有更好的方法来浏览目录,例如,使用之前使用的path.rglobos.walk方法。 请注意,我是在脑海里写这段代码,没有以任何方式对其进行测试。 附带一提,恕我直言,我将重构您的方法并按以下方式调用

def load (director,case):
    # Get images for the pa and case
    # Process the images

这可能会降低其复杂性。实际上,为了遵守单一职责原则(SRP),您可能需要进一步重构该方法。例如,您需要一种方法来获取目录的所有图像

def get_images (director):
  pass

哪个返回图像列表(在这种情况下,仅返回.png文件)。然后,您将需要另一种处理图像的方法

def process_image (Imsize):
    pass

我希望这会有所帮助!