新增dce分图(医疗)
This commit is contained in:
259
src/sorting_dce.py
Normal file
259
src/sorting_dce.py
Normal file
@@ -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())
|
||||
Reference in New Issue
Block a user