基于Excel配置并使用多线程搜索并复制匹配文件夹的工具(15线程)
代码功能:
这段脚本的核心功能是:读取一个Excel文件,从中获取搜索路径、关键字和目标文件夹,并基于这些信息查找匹配的文件夹并复制到目标位置。
使用格式:
- Excel文件格式:
- 第一列 (A列):逗号分隔的搜索路径。
- 第二列 (B列):逗号分隔的关键字。
- 第三列 (C列):目标文件夹的路径。
例如:
搜索路径 | 关键字 | 目标文件夹 ----------------|---------|------------- /home/user/A | proj1 | /home/backup /home/user/B | proj2 | /home/backup - 在脚本运行时,它会提示用户输入Excel文件的路径。输入正确的路径后,脚本开始执行复制操作。
注意要点:
-
关于重试:复制操作有最大重试次数(默认为3次)。这是为了处理可能的文件系统错误或其他异常。如果在第一次复制时失败,脚本会等待一段时间(默认为5秒)再尝试,直到达到最大重试次数。
-
并发:为了加速查找和复制操作,脚本使用了多线程,并发地处理多个搜索路径。默认的最大工作线程数为15,但可以根据需要进行调整。
-
路径检查:脚本会检查搜索路径是否存在,如果不存在,它会打印一条消息并跳过这个路径。
-
目标文件夹的命名:目标文件夹的名称会包含所有的关键字,用下划线分隔。例如,如果关键字是"proj1"和"proj2",则目标文件夹会被命名为"proj1_proj2"。
-
安装必要的库:要运行此脚本,必须确保已安装
openpyxl库,因为这是处理Excel文件的必要库。 -
Excel文件的格式:确保Excel文件的格式与上述格式匹配。第一行被视为标题或头部,并不会被处理。从第二行开始处理数据。
import os
import shutil
import openpyxl
import time
from concurrent.futures import ThreadPoolExecutor
MAX_RETRIES = 3
RETRY_DELAY = 5
def copy_folder(src, dest):
for attempt in range(MAX_RETRIES):
try:
shutil.copytree(src, dest)
return True
except Exception as e:
if attempt < MAX_RETRIES - 1:
time.sleep(RETRY_DELAY)
else:
return False
return False
def find_matching_folders(search_path, keywords):
return [name for name in os.listdir(search_path) if any(keyword.lower() in name.lower() for keyword in keywords)]
def process_search_path(args):
search_path, keywords, final_target_folder = args
if not os.path.exists(search_path):
print(f"路径 {search_path} 不存在。")
return
matched_folders = find_matching_folders(search_path, keywords)
for folder_name in matched_folders:
folder_path = os.path.join(search_path, folder_name)
if os.path.isdir(folder_path):
print(f"复制文件夹 {folder_path} 到 {final_target_folder}...")
copy_folder(folder_path, os.path.join(final_target_folder, folder_name))
def copy_matching_folders(search_paths, keywords, target_folder):
final_target_folder = os.path.join(target_folder, "_".join(keywords))
if not os.path.exists(final_target_folder):
os.makedirs(final_target_folder)
with ThreadPoolExecutor(max_workers=15) as executor: # 设置为15个工作线程
executor.map(process_search_path, [(path, keywords, final_target_folder) for path in search_paths])
def main(excel_path):
workbook = openpyxl.load_workbook(excel_path)
sheet = workbook.active
for row in sheet.iter_rows(min_row=2, values_only=True):
if not row or not any(cell_value for cell_value in row):
continue
search_paths = [p.strip() for p in (row[0] or "").split(",")]
keywords = [k.strip() for k in (row[1] or "").split(",")]
target_folder = row[2] or ""
copy_matching_folders(search_paths, keywords, target_folder)
print("全部任务完成!")
if __name__ == "__main__":
excel_path = input("请输入Excel文件路径:")
main(excel_path)
浙公网安备 33010602011771号