python实现随机复制若干个文件到新目录

python实现随机复制若干个文件到新目录

1说明

1.1 目的

随机选择一个文件下的若干个文件,并将文件复制到新文件夹下

1.2 要求

需要将random_select_and_copy_file.py文件放置在父目录下,并选定相应的文件夹,比如需要选择train文件夹下的若干个图片
目录结构

图片文件:

注意:并且默认新生成存放文件的目录为new_train,所以该路径下不能有已存在new_train目录

2代码实现


from shutil import copyfile

import random
import os


def random_select_and_copy_files(dir_name=None, select_number=0):
    '''
    随机从dir_name目录中选择select_number个文件并复制到new_dir_name目录下
    :param dir_name: 待选择文件的目录名
    :param select_number: 随机选择的文件数量
    :return: None
    '''

    # 处理输入目录名异常
    try:
        dir_name is None or dir_name not in os.listdir(os.getcwd())
    except:
        print("输入目录名错误")

    dir_path = os.path.join(os.getcwd(), dir_name)  # 获取文件目录路径
    files_list = os.listdir(dir_path)  # 生成文件名列表
    files_number = len(files_list)

    # 处理输入数量异常
    try:
        select_number > files_number
    except:
        print("选择文件超过原本数量")

    generate_list = random.sample(files_list, select_number)  # 随机选取文件

    # 生成存放文件新目录,默认以new开头
    new_dir_path = os.path.join(os.getcwd(), 'new_'+dir_name)
    os.mkdir(new_dir_path)

    success_number = 0  # 记录成功数量
    success_list = []  # 记录成功文件

    # 复制文件并记录
    for file_name in generate_list:
        orl_file_path = os.path.join(dir_path, file_name)
        new_file_path = os.path.join(new_dir_path, file_name)
        copyfile(orl_file_path, new_file_path)  # 复制文件

        success_list.append(file_name)
        success_number += 1
        if success_number % 100 == 0:
            print("success", success_number)

    # 给出提示信息并给出未成功文件
    if success_number == select_number:
        print("all", select_number, "finish")
    else:
        print("unfinished")
        error_list = []
        for file_name in files_list:
            if file_name not in success_list:
                error_list.append(file_name)
        print(error_list, 'error', sep='\n')



if __name__ == "__main__":
    random_select_and_copy_files("train", 10)


3效果

生成新目录,并且随机拷贝若干个文件到新目录

版权声明:本文为welan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/welan/p/13732836.html