import os import shutil import difflib def copy_organ_files(source_root, target_root): # 確保目標資料夾存在 if not os.path.exists(target_root): os.makedirs(target_root) print(f"Created directory {target_root}") # 遍歷來源的根資料夾和所有子資料夾,尋找名為 ORGAN 的資料夾 for root, dirs, files in os.walk(source_root): for dir in dirs: if dir == 'ORGAN': source_folder_path = os.path.join(root, dir) # 提取病例資料夾和日期資料夾 case_folder = os.path.basename(os.path.dirname(os.path.dirname(os.path.dirname(source_folder_path)))) date_folder = os.path.basename(os.path.dirname(os.path.dirname(source_folder_path))) # 組合目標資料夾路徑 target_folder_path = os.path.join(target_root, case_folder, date_folder) # 確保目標資料夾存在 if not os.path.exists(target_folder_path): os.makedirs(target_folder_path) print(f"Created directory {target_folder_path}") # 複製資料夾中的所有檔案到目標資料夾 for file_name in os.listdir(source_folder_path): source_file_path = os.path.join(source_folder_path, file_name) target_file_path = os.path.join(target_folder_path, file_name) # 如果目標檔案已經存在,重新命名以避免覆蓋 if os.path.exists(target_file_path): base, extension = os.path.splitext(file_name) counter = 1 new_file_name = f"{base}_{counter}{extension}" target_file_path = os.path.join(target_folder_path, new_file_name) while os.path.exists(target_file_path): counter += 1 new_file_name = f"{base}_{counter}{extension}" target_file_path = os.path.join(target_folder_path, new_file_name) shutil.copy(source_file_path, target_file_path) print(f"Copied {source_file_path} to {target_file_path}") print("All ORGAN files have been copied.") def check_and_copy_files(root_dir, required_file_groups, target_dir, match_cutoff=0.7): # 確保目標目錄存在 os.makedirs(target_dir, exist_ok=True) # 計算缺少文件的病人數量 missing_files_patients = 0 copied_files_patients = 0 # 遍歷根目錄下的每個病人文件夾 for patient_id in os.listdir(root_dir): patient_dir = os.path.join(root_dir, patient_id) # 確保是目錄 if os.path.isdir(patient_dir): # 遍歷病人目錄下的日期文件夾 for date_folder in os.listdir(patient_dir): date_dir = os.path.join(patient_dir, date_folder) existing_files = os.listdir(date_dir) # 檢查指定的OAR文件是否存在 missing_files = [] for file_group in required_file_groups: # 對於左右眼的文件,進行更精確的匹配 if 'Left_Eye' in file_group[0]: matches = [f for f in existing_files if 'Left_Eye' in f] elif 'Right_Eye' in file_group[0]: matches = [f for f in existing_files if 'Right_Eye' in f] else: # 對其他文件使用模糊匹配來查找接近的文件名稱 matches = difflib.get_close_matches(file_group[0], existing_files, n=1, cutoff=match_cutoff) if not matches: missing_files.append(file_group[0]) # 使用文件組中的第一個文件名作為缺失文件的表示 else: print(f"匹配到的文件: {matches[0]} 對應到 {file_group[0]}") if missing_files: missing_files_patients += 1 print(f"病人: {patient_id}, 日期: {date_folder}, 缺失的文件: {missing_files}") else: # 沒有缺失文件,複製文件到新目錄 new_patient_dir = os.path.join(target_dir, patient_id) new_date_dir = os.path.join(new_patient_dir, date_folder) os.makedirs(new_date_dir, exist_ok=True) for file_name in existing_files: src_file = os.path.join(date_dir, file_name) dst_file = os.path.join(new_date_dir, file_name) shutil.copy(src_file, dst_file) copied_files_patients += 1 print(f"病人: {patient_id}, 日期: {date_folder}, 文件已成功複製") print(f"缺少所需OAR文件的資料總數: {missing_files_patients}") print(f"文件完整且已複製的資料總數: {copied_files_patients}") def count_patients_and_records(target_dir): patient_count = 0 record_count = 0 for patient_id in os.listdir(target_dir): patient_dir = os.path.join(target_dir, patient_id) if os.path.isdir(patient_dir): patient_count += 1 record_count += len(os.listdir(patient_dir)) print(f"完整OAR文件的病人總數: {patient_count}") print(f"完整OAR文件的資料總數: {record_count}") if __name__ == "__main__": # 第一部分:複製 ORGAN 文件 source_root = '/mnt/1218/onlylian/M6_24Q3/nii' intermediate_target = '/mnt/1218/onlylian/NEW_ORGAN_Files' copy_organ_files(source_root, intermediate_target) # 第二部分:檢查並複製完整的 OAR 文件 required_file_groups = [ ['Struct_Brain_Stem.nii.gz'], ['Struct_Left_Optic_Nerve.nii.gz'], ['Struct_Right_Optic_Nerve.nii.gz'], ['Struct_Left_Eye.nii.gz'], ['Struct_Right_Eye.nii.gz'], ['Struct_Optic_Chiasm.nii.gz'] ] final_target = '/mnt/1218/onlylian/Complete_NEW_OAR_Files' check_and_copy_files(intermediate_target, required_file_groups, final_target) # 計算總共的病人和記錄數量 count_patients_and_records(final_target)