diff --git a/src/sorting_dce.py b/src/sorting_dce.py new file mode 100644 index 0000000..df31b76 --- /dev/null +++ b/src/sorting_dce.py @@ -0,0 +1,259 @@ +import os +import shutil +import re +import sys + + +def find_target_folders(root_path, output_path): + """ + 递归遍历根目录,找到包含特定关键词子文件夹的父文件夹,并进行相应的复制和重命名操作 + """ + + # 确保输出目录存在 + os.makedirs(os.path.join(output_path, "DCE0"), exist_ok=True) + os.makedirs(os.path.join(output_path, "DCE1"), exist_ok=True) + + # 使用递归函数遍历 + for item in os.listdir(root_path): + item_path = os.path.join(root_path, item) + if os.path.isdir(item_path): + process_directory(item_path, output_path) + + +def process_directory(current_path, output_path): + """ + 递归处理目录 + """ + # 获取当前文件夹的名称 + current_folder_name = os.path.basename(current_path) + + # 检查当前目录下是否包含目标文件夹 + contains_disco = False + contains_twist = False + + for sub_item in os.listdir(current_path): + sub_item_path = os.path.join(current_path, sub_item) + if os.path.isdir(sub_item_path): + # 检查是否包含DISCO目标文件夹 + if "DISCO Dyn Mph 4 Nav" in sub_item: + contains_disco = True + + # 检查是否包含twist目标文件夹 + if "twist_dixon_tra_dyn_p4" in sub_item: + contains_twist = True + + # 如果包含DISCO目标文件夹 + if contains_disco: + print(f"找到包含DISCO文件夹的父文件夹: {current_folder_name} (路径: {current_path})") + process_disco_parent_folder(current_path, current_folder_name, output_path) + # 找到后不需要继续递归,因为这个父文件夹就是我们需要的 + return + + # 如果包含twist目标文件夹 + if contains_twist: + print(f"找到包含twist文件夹的父文件夹: {current_folder_name} (路径: {current_path})") + process_twist_parent_folder(current_path, current_folder_name, output_path) + # 找到后不需要继续递归,因为这个父文件夹就是我们需要的 + return + + # 如果不包含目标文件夹,继续递归遍历子目录 + for sub_item in os.listdir(current_path): + sub_item_path = os.path.join(current_path, sub_item) + if os.path.isdir(sub_item_path): + process_directory(sub_item_path, output_path) + + +def process_disco_parent_folder(folder_path, folder_name, output_path): + """ + 处理包含DISCO目标文件夹的父文件夹 + """ + + # 遍历父文件夹内的所有子文件夹 + for sub_item in os.listdir(folder_path): + sub_item_path = os.path.join(folder_path, sub_item) + + if not os.path.isdir(sub_item_path): + continue + + # 查找包含 "DISCO Dyn Mph 4 Nav_0" 的文件夹 + if "DISCO Dyn Mph 4 Nav_0" in sub_item: + target_path = os.path.join(output_path, "DCE0", f"DCE0_{folder_name}") + + # 如果目标路径已存在,先删除 + if os.path.exists(target_path): + shutil.rmtree(target_path) + + # 复制文件夹 + try: + shutil.copytree(sub_item_path, target_path) + print(f" 复制到 DCE0: {sub_item} -> DCE0_{folder_name}") + except Exception as e: + print(f" 复制失败: {e}") + + # 查找包含 "DISCO Dyn Mph 4 Nav_7" 的文件夹 + elif "DISCO Dyn Mph 4 Nav_7" in sub_item: + target_path = os.path.join(output_path, "DCE1", f"DCE1_{folder_name}") + + # 如果目标路径已存在,先删除 + if os.path.exists(target_path): + shutil.rmtree(target_path) + + # 复制文件夹 + try: + shutil.copytree(sub_item_path, target_path) + print(f" 复制到 DCE1: {sub_item} -> DCE1_{folder_name}") + except Exception as e: + print(f" 复制失败: {e}") + + +def process_twist_parent_folder(folder_path, folder_name, output_path): + """ + 处理包含twist目标文件夹的父文件夹 + """ + + # 收集所有符合条件的文件夹 + candidate_folders = [] + + # # 首先找到包含"twist_dixon_tra_dyn_p4"的文件夹 + # twist_folder_path = None + # for sub_item in os.listdir(folder_path): + # sub_item_path = os.path.join(folder_path, sub_item) + # + # if not os.path.isdir(sub_item_path): + # continue + # + # # 找到包含"twist_dixon_tra_dyn_p4"的文件夹 + # if "twist_dixon_tra_dyn_p4" in sub_item: + # twist_folder_path = sub_item_path + # break + # + # if not twist_folder_path: + # print(f" 错误: 未找到包含twist_dixon_tra_dyn_p4的文件夹") + # return + + # 遍历twist文件夹内的子文件夹 + for sub_item in os.listdir(folder_path): + sub_item_path = os.path.join(folder_path, sub_item) + + if not os.path.isdir(sub_item_path): + continue + + # 检查是否包含目标关键词且以"_W"结尾 + if "vibe-twist_dixon_tra_dyn_p4_TTC" in sub_item and sub_item.endswith("_W"): + # 提取TTC值 + match = re.search(r'TTC=([\d\.]+)s_', sub_item) + if match: + ttc_value = float(match.group(1)) + candidate_folders.append((sub_item, sub_item_path, ttc_value)) + print(f" 找到候选文件夹: {sub_item}, TTC={ttc_value}") + + if not candidate_folders: + print(f" 未找到符合条件的文件夹") + return + + # 按TTC值排序 + candidate_folders.sort(key=lambda x: x[2]) + + # 找出TTC值最小的文件夹(用于DCE0) + dce0_candidate = candidate_folders[0] + target_path = os.path.join(output_path, "DCE0", f"DCE0_{folder_name}") + + # 如果目标路径已存在,先删除 + if os.path.exists(target_path): + shutil.rmtree(target_path) + + # 复制文件夹到DCE0 + try: + shutil.copytree(dce0_candidate[1], target_path) + print(f" 复制到 DCE0: {dce0_candidate[0]} -> DCE0_{folder_name}") + except Exception as e: + print(f" 复制失败: {e}") + + # 找出TTC值大于200且最小的文件夹(用于DCE1) + dce1_candidate = None + for item, item_path, ttc_value in candidate_folders: + if ttc_value > 200: + dce1_candidate = (item, item_path, ttc_value) + break + + if dce1_candidate: + target_path = os.path.join(output_path, "DCE1", f"DCE1_{folder_name}") + + # 如果目标路径已存在,先删除 + if os.path.exists(target_path): + shutil.rmtree(target_path) + + # 复制文件夹到DCE1 + try: + shutil.copytree(dce1_candidate[1], target_path) + print(f" 复制到 DCE1: {dce1_candidate[0]} -> DCE1_{folder_name}") + except Exception as e: + print(f" 复制失败: {e}") + else: + print(f" 未找到TTC>200的文件夹") + + +def main(): + """ + 主函数 + """ + # 获取用户输入 + print("文件夹处理工具") + print("=" * 50) + + # # 输入根目录路径 + # while True: + # root_path = input("请输入要遍历的根目录路径: ").strip() + # if os.path.isdir(root_path): + # break + # else: + # print(f"错误: 路径 '{root_path}' 不存在或不是目录") + # + # # 输入输出路径 + # while True: + # output_path = input("请输入输出目录路径: ").strip() + # # 尝试创建输出目录 + # try: + # os.makedirs(output_path, exist_ok=True) + # break + # except Exception as e: + # print(f"错误: 无法创建输出目录 '{output_path}': {e}") + + root_path = "E:\\2pi(增强已分期)" + output_path = "F:\\pi2_convert" + + # 执行处理 + print("\n开始处理...") + print("-" * 50) + + try: + find_target_folders(root_path, output_path) + print("\n处理完成!") + + # 显示结果 + dce0_path = os.path.join(output_path, "DCE0") + dce1_path = os.path.join(output_path, "DCE1") + + if os.path.exists(dce0_path): + dce0_items = os.listdir(dce0_path) + print(f"\nDCE0文件夹中有 {len(dce0_items)} 个文件夹:") + for item in dce0_items: + print(f" {item}") + + if os.path.exists(dce1_path): + dce1_items = os.listdir(dce1_path) + print(f"\nDCE1文件夹中有 {len(dce1_items)} 个文件夹:") + for item in dce1_items: + print(f" {item}") + + except Exception as e: + print(f"处理过程中出现错误: {e}") + import traceback + traceback.print_exc() + return 1 + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file