python 条件批量复制文件

前言

我有一个多级文件夹,我想复制文件夹中除了*.bin文件外的所有文件和*best*.bin文件。

代码

import os
import shutil


def condition_copy(source_path: str, target_path: str, condition):
    """
    条件复制
    :param source_path: 源路径
    :param target_path: 目标路径
    :param condition: 条件函数, 输入完整文件路径, 返回True or False
    :return: None
    """
    paths = []  # 存放文件夹路径
    files = []  # 存放文件路径

    def findfiles(path):
        # 首先遍历当前目录所有文件及文件夹
        file_list = os.listdir(path)
        # 循环判断每个元素是否是文件夹还是文件,是文件夹的话,递归
        for file in file_list:
            # 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录
            cur_path = os.path.join(path, file)
            # 判断是否是文件夹
            if os.path.isdir(cur_path):
                paths.append(cur_path)
                findfiles(cur_path)
            else:
                files.append(cur_path)

    findfiles(source_path)
    # 选择所需的文件
    select_files = [i for i in files if condition(i)]

    # 原始路径转换为目标路径
    target_files = [i.replace(source_path, target_path) for i in select_files]
    target_paths = [i.replace(source_path, target_path) for i in paths]

    # 创建文件夹
    if not os.path.exists(target_path):
        os.mkdir(target_path)
    for path in target_paths:
        if not os.path.exists(path):
            os.mkdir(path)

    # 复制文件
    for i in range(len(select_files)):
        if os.path.exists(target_files[i]):  # 跳过已存在的文件
            continue
        shutil.copy2(select_files[i], target_files[i])
        print('(%i/%i)' % (i+1, len(select_files)), target_files[i])

    print('Done!')


def condition(path: str):
    return 'best' in path or (not path.endswith('.bin'))


if __name__ == '__main__':
    source_path = '~/project'
    target_path = '~/project_select'
    condition_copy(source_path, target_path, condition)

注意事项

condition方法定义了文件筛选条件,当一个文件的文件名符合我们的要求时返回True,否则返回False

def condition(path: str):
    return 'best' in path or (not path.endswith('.bin'))

source_pathtarget_path形式要一样,切勿在其中一个后面加/

# 正确1
source_path = '~/project'
target_path = '~/project_select'
# 正确2
source_path = '~/project/'
target_path = '~/project_select/'
# 错误示范
source_path = '~/project/'
target_path = '~/project_select'
要使用Python进行文件批量复制,可以使用pathlib和shutil两个库。首先,使用pathlib库来寻找目标文件,然后使用shutil库来复制文件。下面是一个具体的实现代码示例: ```python import os import shutil source_path = "C:\\Users\\Administrator\\Desktop\\新建文件夹" # 原始文件夹路径 copy_path = "C:\\Users\\Administrator\\Desktop\\处理后" # 目标文件夹路径 for folderName, subfolders, filenames in os.walk(source_path): i = 0 for filename in filenames: # 原始文件地址 org_file = os.path.join(folderName, filename) # 当前文件所在文件夹地址,用于后续按此文件夹名称新建 folder = folderName.split('\\')\[-1\] # 单个文件夹仅新建一次 if i == 0: os.makedirs(copy_path + '\\' + folder) i += 1 if folderName != copy_path: # 复制文件到目标文件夹,并重命名为'复制文件名1.pdf' shutil.copy(org_file, copy_path + '\\' + folder + '\\' + '复制文件名1.pdf') # 复制文件到目标文件夹,并重命名为'复制文件名2.pdf' shutil.copy(org_file, copy_path + '\\' + folder + '\\' + '复制文件名2.pdf') # 复制文件到目标文件夹,并重命名为'复制文件名3.pdf' shutil.copy(org_file, copy_path + '\\' + folder + '\\' + '复制文件名3.pdf') print(folderName, ' done') ``` 以上代码会遍历原始文件夹中的所有文件和子文件夹,并将文件复制到目标文件夹中。复制文件会按照指定的命名规则进行重命名。请根据实际情况修改源文件夹路径和目标文件夹路径,并根据需要修改文件复制和重命名规则。 #### 引用[.reference_title] - *1* *2* [Python实现批量复制文件](https://blog.csdn.net/weixin_42140291/article/details/121371277)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【python学习】批量复制文件](https://blog.csdn.net/Lynqwest/article/details/130395590)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值