Я хочу перебрать пакет файлов, чтобы получить 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 в одном цикле






Вы можете взглянуть на 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