从一个文件夹中随机选择文件并递归复制到子文件夹中

Random selection of files from one folder and recursively copy them into subfolders

我在名为 Data 的文件夹中有 500 个 zip 文件,我需要从中随机 select 5 个文件并将这些文件复制到子文件夹。我的文件夹结构如下:

    Root_Folder  
    |__Data (contains 500 zip files)  
    |__Assign_Folder  
        |__One (subfolder)
            |__a1 (sub-subfolder)
            |__a2 (and so on)
        |__Two (subfolder)
            |__a1 (sub-subfolder)
            |__a2 (and so on)
    |__script.py
        

Python 脚本位于 Root_Folder. 我想从 中随机 select 5 个 zip 文件]Data 文件夹并将它们递归复制到 One, Two, ... 中的每个 a1, a2, a3, ... 子文件夹中 个父文件夹。所以,最后我想将 5 个 zip 文件分别复制到 One, Two, ...[= 内的 a1, a2, ... 文件夹中30=] 父文件夹。有足够的子文件夹,可以轻松复制文件。

我写了下面的代码:

import os
import random
import shutil

data_path = 'Data'
root_folder = 'Assign_Folder'

for folder, subs, files in os.walk(root_folder): 
    # select 5 random files
    filenames = random.sample(os.listdir(data_path), 5)

    for fname in filenames:
        srcpath = os.path.join(data_path, fname)
        shutil.copyfile(srcpath, folder)

这段代码给我一个错误 IsADirectoryError: [Errno 21] 是一个目录: 'Assign_Folder'

请帮助我更正并完成此任务。谢谢。

如果第二个参数是目录,

shutil.copyfile 失败 您要复制的文件。所以你必须附加 目标文件名。

此外,由于您只想复制 的叶目录中的文件 Assign_Folder,您必须忽略 os.walk 生成的目录 确实有 sub-directories。你可以通过检查第二个来做到这一点 os.walk 生成的元组元素(参见 Printing final (leaf?) 目录列表中的节点 Python).

有了这两个补丁,代码变成:

import os
import random
import shutil

data_path = 'Data'
root_folder = 'Assign_Folder'

for folder, subs, files in os.walk(root_folder):
    if not subs:  #  ignore the directory if it does have sub-directories

        # select 5 random files
        filenames = random.sample(os.listdir(data_path), 5)

        for fname in filenames:
            srcpath = os.path.join(data_path, fname)
            dstpath = os.path.join(folder, fname)
            shutil.copyfile(srcpath, dstpath)