Python多线程、多进程拷贝文件

用Python多线程、多进程拷贝Windows文件夹下包含当天日期的文件到另一个目录下的示例代码:

'''
@project : MyPythonScript
@IDE :PyCharm
@Author : liwei
@Date : 2023/5/9 10:57
'''
import datetime
import multiprocessing
import os
import shutil
from concurrent.futures import ThreadPoolExecutor

class CopyFiles:

    def __init__(self):
        self.src_dir = src_dir  #源目录
        self.dst_dir = dst_dir  #目标目录

    def copy_file(self,src_dir,dst_dir) :
        try:
            shutil.copy2(src_dir,dst_dir)
        except Exception as e:
            print(e)

    def multiprocess_copy_file(self,src_dir,dst_dir):  #多进程拷贝源目录下所有文件到目标目录
        file_list = []
        for root,dirs,files in os.walk(src_dir):
            for file in files:
                    file_list.append(os.path.join(root,file))
        """root:源文件所在路径
          dirs:源文件中存在的文件夹
          files: 源文件中的文件"""

        pool =multiprocessing.Pool(processes=10)
        """创建进程池,使用10个进程并行跑"""
        for file_path in file_list:
            pool.apply_async( self.copy_file,args=(file_path,dst_dir))
            """添加拷贝任务到进程池中"""
        pool.close()
        """关闭进程池,表示不能再往进程池中添加任务"""
        pool.join()
        """等待进程池中所有任务执行完毕"""
        print("拷贝所有文件%s个完成"% len(file_list))

    def multiprocess_today_file(self,src_dir,dst_dir):   #多进程拷贝源文件夹中包含当天日期的文件到目标目录
        todat_str = datetime.date.today().strftime("%Y%m%d")
        """获取日期格式20230509,可跟着需求获取其他,如datetime.date.today().strftime("%Y-%m-%d")   2023-05-09"""
        file_list = []
        for root,dirs,files in os.walk(src_dir):
            for file in files:
                if todat_str in file:   # 如果源文件包含今天的日期
                    file_list.append(os.path.join(root,file))
        """root:源文件所在路径
          dirs:源文件中存在的文件夹
          files: 源文件中的文件"""

        pool =multiprocessing.Pool(processes=10)
        """创建进程池,使用10个进程并行跑"""
        for file_path in file_list:
            pool.apply_async( self.copy_file,args=(file_path,dst_dir))
            """添加拷贝任务到进程池中"""
        pool.close()
        """关闭进程池,表示不能再往进程池中添加任务"""
        pool.join()
        """等待进程池中所有任务执行完毕"""
        print("拷贝当天文件%s个完成"% len(file_list))

    def today_file(self, file_path):
        todat_str = datetime.date.today().strftime("%Y%m%d")
        try:
            if todat_str in file_path:    # 如果文件包含当天日期,则拷贝到目标目录
                shutil.copy2(file_path,dst_dir)
                print(f"File {file_path} has been copied successfully")
        except Exception as e:
            print(f"Error copying file:{file_path}")
            print(str(e))

    def ThreadPool_copy_file(self):
        fileall = []
        executor = ThreadPoolExecutor(max_workers=10)   # 创建线程池,最大线程数为10,可调整
        for root, dirs,files in os.walk(src_dir):  # 遍历源目录下的所有文件
            for file in files:
                fileall.append(file)
                file_path = os.path.join(root,file)
                executor.submit(self.today_file, file_path)  # 将每个文件提交给线程池处理
        executor.shutdown()   # 关闭线程池
        print("Having copied %s files "%len(fileall))

    if __name__ == '__main__':
        src_dir = "\\\\127.0.0.1\\d$\\exportdir"
        dst_dir = "\\\\127.0.e.1\\d$\\remote"
        CopyFiles().multiprocess_today_file(src_dir,dst_dir)  #多进程拷贝文件
        CopyFiles().ThreadPool_copy_file()   #多线程拷贝文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经历一个春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值