Как пройти через подпапки индивидуально? - PullRequest
0 голосов
/ 04 марта 2019

На самом деле у меня есть папка (данные на картинке ниже), которая содержит 2 подпапки, и каждая подпапка содержит несколько файлов .png.Мне нужно пройти через каждую подпапку, выполнить кодирование каждого файла изображения в этой подпапке и сохранить результат.Я использовал os.walk() и os.listdir() и glob.glob(), но ни один из них не работал.Один из многих кодов, которые я пробовал, такой же, как показано ниже:

path1 = Path('./data')
path2 = os.listdir(path1)

# loop through main folder to read each subfolder
for i in path2:
    if not i.startswith('.'):
       path3 = Path(os.path.join(path1,i))
       path4 = os.listdir(path3)

    #loop through each subfolder to read each file
       for j in path4:
           #some coding

введите описание изображения здесь

Любое предложение будет высоко оценено.

Ответы [ 4 ]

0 голосов
/ 05 марта 2019

Я мог найти свой ответ!Это было довольно просто, но я ошибся в названии.Итак, код написан ниже, может помочь другим с такой же проблемой:

path = "./data/"

for subfolder in os.listdir(path):
    subfolder_name = path + subfolder

    for imgs in os.listdir(subfolder_name):
        imagename = subfolder_name + '/' + imgs

        # do some coding
0 голосов
/ 04 марта 2019

Вы можете использовать listdir() так:

# pathname of root dir
images_path = "./data"

# filtered file extension
suffix = ".png"

# For each image,
for i in os.listdir(images_path):
    file = os.path.basename(i)
    fileName, fileExtension = os.path.splitext(file)
    # is it an image file with 'suffix' extension ?
    if os.path.isfile(images_path+'/'+i) and fileExtension == suffix:
        # do some coding
0 голосов
/ 04 марта 2019

Примерно так: os.walk:

import os
for root, dirs, files in os.walk(path_to_data_folder):
#    if not root.endswith(good_folder_name):
#        continue
    for fname in files:
        if fname_meets_my_criteria:
            fpath = os.path.join(root, fname)
            with open(fpath, 'r') as f, open(new_file_path, 'w') as newfile:
                data = f.read()
                # process file data
                new_data = func_that_processes_data(data)
                newfile.write(new_data)

с псевдокодом:

  • fname_meets_my_criteria заменяетдля сравнения, это нужно, если вы хотите отфильтровать файлы для обработки - это может быть что-то вроде fname.edswith('.txt') или not fname.endswith('.cfg')

  • new_file_path - путь и имя для новогофайл, в который будут записаны обработанные данные.


Если вы намерены перезаписать файлы после того, как они были обработаны, используйте вместо этого:

for root, dirs, files in os.walk(path_to_data_folder):
#    if not root.endswith(good_folder_name):
#        continue
    for fname in files:
        if fname_meets_my_criteria:
            fpath = os.path.join(root, fname)
            with open(fpath, 'r') as f:
                data = f.read()
            # process file data
            new_data = func_that_processes_data(data)
            with open(fpath, 'w') as f:
                f.write(new_data)

В обоих моих примерах файлы были открыты как текстовые файлы.Если вам нужно обработать байты вместо test / strings, откройте файлы с mode аргументами 'rb' или 'wb'

0 голосов
/ 04 марта 2019

Я бы предложил использовать библиотеку pathlib.Библиотека представляет собой модуль «Объектно-ориентированные пути файловой системы», который объединяет лучшие модули Python для файловой системы, такие как os, os.path и glob.

from pathlib import Path

path1 = Path('./data')
files = [item.as_posix() for item in path1 .glob('**/*.png') if item.is_file()]

Это даст вам список всех .pngпути в подпапках данных.

...