python多线程、多进程拷贝目录文件

'''
@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()   #多线程拷贝文件

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务