首页 > 解决方案 > 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 numero 1 到 32 的文件 + dir2 numero 1 到 32 的文件 + dir3 numero 1 到 32 的文件然后

dir1 numero 33 到 64 的文件 + dir2 numero 33 到 64 的文件 + dir3 numero 33 到 64 的文件在同一个循环中

标签: pythonfileloops

解决方案


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

推荐阅读