LIENWEIYING/test/OAR_Files/organ_file_processor.py
2026-07-22 14:50:09 +08:00

138 lines
No EOL
6.4 KiB
Python

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)