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