Python在一批文件上循环

2024-09-29 19:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想循环一批文件,以便一次获得每个子目录的32个图像(由于内存原因,我无法加载所有图像),例如加载每个目录的img1-32使用它们,然后加载img33-64,然后加载65-96等

我的目录:

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

所以我需要在第一个循环加载img1,2,…,325000001,…50000321000001,…1000032,然后在第二个循环加载img33,34,…,645000033,…500006410033,…1000064

有什么方法可以正确地做到这一点吗?在

我试着用手术室步行它允许我在我的目录上循环,但我不知道如何使这个循环适应我所需的32个批处理?在

^{pr2}$

编辑

你所有的评论都会给我带来这样的东西:

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的文件在同一循环中


Tags: 文件内存图像目录img原因jpgimg1
3条回答

os.walk已经返回一个生成器,该生成器将动态生成一个3元组(dirpath、dirnames、filenames)值,因此您只需成批生成filenames数组的片段。


这是一个例子:

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

不需要Python脚本,可以使用命令行上的tree命令来实现:

C:\Temp_Folder\images>tree /F
C:.
├───dir1
│       image1.jpg
│       image2.jpg
│       image3.jpg
│
├───dir2
│       image1.jpg
│       image2.jpg
│       image3.jpg
│
└───dir3    

如果您想处理这些文件,也可以使用forfiles

^{pr2}$

(这只是为了显示文件(echo),但也可以使用其他命令行命令)

你可以看看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

相关问题 更多 >

    热门问题