Цикл по подкаталогам, чтобы образцы файлов

Следующий код выбирает случайную выборку файлов (в данном случае 50) из каталога 1 и копирует их в новую папку с тем же именем.

Тем не менее, у меня есть сотни папок, из которых мне нужно взять образцы (и скопировать в новую папку с тем же именем).

Как я могу настроить первую часть кода так, чтобы я мог перебирать все подкаталоги и перемещать примеры в новую папку с тем же именем. (таким образом, образец sub dir 1 идет в dir 1, образец sub dir 2 идет в dir 2 и т. д.)

import os 
import shutil 
import random 
from shutil import copyfile

sourcedir = '/home/mrman/dataset-python/train/1/'
newdir  = '/home/mrman/dataset-python/sub-train/1'


filenames = random.sample(os.listdir(sourcedir), 50)
for i in filenames:
    shutil.copy2(sourcedir + i, newdir)

2 ответа

Решение

Решение оказалось проще, чем ожидалось (спасибо @idjaw за подсказку):

import os, sys
import shutil
import random
from shutil import copyfile

#folder which contains the sub directories
source_dir = '/home/mrman/dataset-python/train/'

#list sub directories 
for root, dirs, files in os.walk(source_dir):

#iterate through them
    for i in dirs: 

        #create a new folder with the name of the iterated sub dir
        path = '/home/mrman/dataset-python/sub-train/' + "%s/" % i
        os.makedirs(path)

        #take random sample, here 3 files per sub dir
        filenames = random.sample(os.listdir('/home/mrman/dataset-python/train/' + "%s/" % i ), 3)

        #copy the files to the new destination
        for j in filenames:
            shutil.copy2('/home/mrman/dataset-python/train/' + "%s/" % i  + j, path)

Вы ищете использовать os.walk, Ознакомьтесь с документацией

Выполните следующее, чтобы понять, как это работает, и прочитайте документацию, чтобы понять, как это можно использовать для вашего решения. В конечном итоге произойдет то, что вы будете обходить всю структуру каталогов по указанному вами пути, и каждая итерация будет указывать вам текущий путь, все каталоги на этом уровне и все файлы.

Также предположим, что вы хотите выполнить операцию на определенном полном пути чего-либо, а затем убедитесь, что вы используете os.path.join при создании своего пути.

your_path = "/some/path/you/want"
for path, dirs, files in os.walk(your_path):
    print(path)
    print(dirs)
    print(files)
Другие вопросы по тегам