Цикл по подкаталогам, чтобы образцы файлов
Следующий код выбирает случайную выборку файлов (в данном случае 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)