遍历子目录,对文件进行抽样。

4
以下代码从目录1中随机选择50个文件,并将它们复制到一个具有相同名称的新文件夹中。
然而,我有数百个文件夹需要从中抽样(并将其复制到一个具有相同名称的新文件夹中)。
如何调整代码的第一部分,以便可以循环遍历所有子目录,并将样本移动到具有相同名称的新文件夹中(因此子目录1的样本移动到目录1 ,子目录2 的样本移动到目录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个回答

5

你想要使用 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)

4
解决方案比预期的简单(感谢 @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)

干得好!很棒地解决了问题。+1 - idjaw
2
既然你已经解决了这个问题,你应该接受解决方案以表示问题已经解决。 - idjaw
再次感谢!由于我是新手,我必须等待两天才能接受它 :-) - mr_man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接