Цикл Python по пакету файлов

Я хочу перебрать пакет файлов, чтобы получить 32 изображения каждого подкаталога за раз (я не могу загрузить все изображения из-за памяти), например, загрузить img 1-32 каждого каталога, использовать их, а затем загрузить img 33- 64, потом 65-96 и т.д.

Мой каталог:

Rootdir
  - dir1
    - img 1
    - img 2
    - img...
  - dir2
    - img 5000001
    - img 5000002
    - img...
  - dir3
    - img 10000001
    - img 10000002
    - img...

Поэтому мне нужно было бы загрузить img1,2,..,32, 5000001,...5000032, 1000001,...10000032 в первом цикле, затем img33,34,..,64, 5000033,... 5000064, 1000033, ...10000064 во втором цикле

Есть ли способ сделать это правильно?

Я пытаюсь использовать os.walk, и это позволяет мне перебирать мой каталог, но я не понимаю, как я могу адаптировать этот цикл к моим необходимым 32 пакетам?

for dirName, subdirList, fileList in os.walk(rootdir):
      print('Found directory: %s' % dirName)
      for fname in sorted(fileList):
        img_path = os.path.join(dirName, fname)
        try:
          img = load_img(img_path, target_size=None)
          imgs.append(img)
        except Exception as e:
          print(str(e), fname, i)
      #do something on imgs

РЕДАКТИРОВАТЬ

все ваши комментарии вызывают у меня такие мысли:

dir1/img1.jpg в dir1/img32.jpg, затем dir1/img33.jpg в dir1/img64.jpg, затем ...

затем dir2/img1.jpg в dir1/img32.jpg затем dir2/img33.jpg в dir2/img64.jpg затем...

затем dir3/img1.jpg в dir3/img32.jpg затем dir3/img33.jpg в dir3/img64.jpg :(

Чего я пытаюсь достичь, так это:

Файлы каталога dir1 с номерами от 1 до 32 + файлы каталога dir2 с номерами от 1 до 32 + файлы каталога dir3 с номерами от 1 до 32, затем

Файлы каталога dir1 с номерами от 33 до 64 + файлы каталога dir2 с номерами от 33 до 64 + файлы каталога dir3 с номерами от 33 до 64 в одном цикле

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
1 634
4

Ответы 4

Вы можете взглянуть на os.walk()

Обновлено: простой встречный пример

counter = 0
for x in mylist:
    # do something with x 
    todo_list.append(x)
    counter += 1
    if counter % 32 == 0: 
        # do something with todo list
        todo_list = [] # empty todo list for next batch

Как насчет того, чтобы всегда использовать один и тот же список изображений и обрабатывать его, как только у вас будет 32 изображения?

for dirName, subdirList, fileList in os.walk('c:\\Java\\'):
      print('Found directory: %s' % dirName)
      for fname in sorted(fileList):
        img_path = os.path.join(dirName, fname)
        try:
          img = load_img(img_path, target_size=None)
          imgs.append(img)
          if len(imgs) == 32:
            print("Doing what I have to with current imgs list (add your function here)")
            img = [] # cleaning img list
        except Exception as e:
          print(str(e))
      #do something on imgs

если вам нужно отслеживать все предыдущие списки, вы можете просто скопировать содержимое списка.

Дайте мне знать, если вы тоже хотите эту реализацию.

os.walk уже возвращает генератор, который на лету выдает значения из 3 кортежей (dirpath, dirnames, filenames), поэтому вам просто нужно получить срез массива имен файлов партиями по 32.


Вот пример:

import os

# Your root directory path
rootdir = r"Root"

#Your batch size
batch_size = 32

def walk_dirs(directory, batch_size):
    walk_dirs_generator = os.walk(directory)
    for dirname, subdirectories, filenames in walk_dirs_generator:
        for i in range(0, len(filenames), batch_size):
            # slice the filenames list 0-31, 32-64 and so on
            yield [os.path.join(dirname, filename) for filename in filenames[i:i+batch_size]]

# Finally iterate over the walk_dirs function which itself returns a generator
for file_name_batch in walk_dirs(rootdir, batch_size):
    for file_name in file_name_batch:
        # Do some processing on the batch now
        print (file_name)
        pass

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

number_of_directory = 17
batch_size = 32
seen = set()
for overall_count in pbar(range(data_number // (batch_size * number_of_directory))):
    imgs = []
    for dirName, subdirList, fileList in os.walk(rootdir):
        count = 0
        for fname in sorted(fileList):
          if fname in seen:
            continue
          if count == batch_size:
            break
          img_path = os.path.join(dirName, fname)
          try:
            img = cv2.imread(img_path, cv2.IMREAD_COLOR)
            img = cv2.resize(img, (img_width, img_height))
            imgs.append(np.array(img))
          except Exception as e:
            print(str(e), fname)
          seen.add(fname)
          count +=1
    #Do something with images

Другие вопросы по теме