Функция ОС в python для чтения файлов

У меня есть структура папок, указанная ниже

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

В основном, для каждого запястья есть несколько па, и для каждого па есть положительное или отрицательное исследование, и для каждого исследования есть до 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, dir_name, 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)

person Adeyemi Adejuwon    schedule 18.08.2020    source источник
comment
попробуйте следующее: рекурсивный обход подкаталогов   -  person Akshay Solunke    schedule 18.08.2020
comment
@qiriro спасибо за ваш ответ. pa обозначает пациентов. У меня тысяча пациентов, и у некоторых есть положительные исследования, а у некоторых отрицательные. Затем положительные или отрицательные исследования имеют несколько изображений.   -  person Adeyemi Adejuwon    schedule 18.08.2020


Ответы (1)


Я не уверен, что хорошо понял ваш вопрос. Однако, если вам нужно просмотреть каталог и обработать все файлы изображений в его подкаталогах, я бы посоветовал вам написать что-то вроде этого:

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

По сути, как вы сказали, если у вас много па (что такое па?), вам сначала нужно получить список всех па и пройтись по каждому из них, чтобы получить доступ к списку cases=["positive", "negative]. Это не оптимально. Есть лучшие способы пройти через каталог, например, используя метод path.rglob или os.walk, который вы использовали ранее. Обратите внимание, что я пишу этот код наугад и никоим образом не тестировал его. В качестве примечания, ИМХО, я бы реорганизовал ваш метод и назвал бы его следующим образом

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

Это потенциально уменьшит его сложность. На самом деле, чтобы соблюсти принцип единой ответственности (SRP), вам, вероятно, потребуется гораздо больше реорганизовать метод. Например, вам нужен метод для получения всех изображений каталога

def get_images (director):
  pass

Который возвращает список изображений (в данном случае только файлы .png). Тогда вам понадобится другой метод, который обрабатывает изображение

def process_image (Imsize):
    pass

Надеюсь, это поможет!

person qiriro    schedule 18.08.2020