LIENWEIYING/preprocessing/Image_files/copy_and_classify_modalities.py

113 lines
5.1 KiB
Python
Raw Permalink Normal View History

2026-07-22 06:50:09 +00:00
import os
import shutil
import pandas as pd
def load_excel(file_path):
"""載入 Excel 文件"""
return pd.read_excel(file_path, sheet_name='Sheet1')
def ensure_directories_exist(target_dir, modalities):
"""確保目標目錄存在"""
for modality in modalities:
os.makedirs(os.path.join(target_dir, modality), exist_ok=True)
def find_file_recursive(filename, search_path):
"""在給定目錄中遞迴搜索文件。"""
for root, dirs, files in os.walk(search_path):
if filename in files:
return os.path.join(root, filename)
return None
def extract_patient_and_date(file_path):
"""從文件路徑中提取病人檔名和日期。"""
parts = file_path.split(os.sep)
if len(parts) >= 4:
return parts[-4], parts[-3] # 假設病人檔名在倒數第四層,日期在倒數第三層
return None, None
def is_swi_file(file_name):
"""檢查檔案名稱是否包含 'swi'"""
return 'swi' in file_name.lower()
def copy_files(df, source_dir, target_dir):
"""遍歷數據框並將對應的 .warp.nii.gz 文件複製到相應的模態資料夾,若無 .warp.nii.gz 則複製原始的 .nii.gz 文件,保留病人檔名和日期"""
processed_patients = set()
for index, row in df.iterrows():
file_name = row['name']
modality = row['modality_nn']
# 檢查是否為 swi 檔案
if is_swi_file(file_name):
print(f'跳過 swi 檔案: {file_name}')
continue
# 修改來源檔名:將 .nii.gz 替換為 .warp.nii.gz
warp_file_name = file_name.replace('.nii.gz', '.warp.nii.gz')
# 在源目錄中遞迴搜索 .warp.nii.gz 文件
warp_file_path = find_file_recursive(warp_file_name, source_dir)
if warp_file_path:
# 如果找到 .warp.nii.gz 文件,複製該文件
patient_id, date = extract_patient_and_date(warp_file_path)
if patient_id and date:
if patient_id not in processed_patients:
processed_patients.add(patient_id)
# 複製到個別的模態資料夾
target_dir_path = os.path.join(target_dir, modality, patient_id, date)
os.makedirs(target_dir_path, exist_ok=True)
target_file_path = os.path.join(target_dir_path, warp_file_name)
shutil.copy2(warp_file_path, target_file_path)
print(f'已複製 {warp_file_name}{target_dir_path} 資料夾。')
# 如果是 CT 或 CTC也複製到 CT+CTC 資料夾
if modality in ['CT', 'CTC']:
combined_target_dir_path = os.path.join(target_dir, 'CT+CTC', patient_id, date)
os.makedirs(combined_target_dir_path, exist_ok=True)
combined_target_file_path = os.path.join(combined_target_dir_path, warp_file_name)
shutil.copy2(warp_file_path, combined_target_file_path)
print(f'已複製 {warp_file_name}{combined_target_dir_path} 資料夾。')
else:
# 如果找不到 .warp.nii.gz 文件,則複製原始的 .nii.gz 文件
original_file_path = find_file_recursive(file_name, source_dir)
if original_file_path:
patient_id, date = extract_patient_and_date(original_file_path)
if patient_id and date:
if patient_id not in processed_patients:
processed_patients.add(patient_id)
# 複製到個別的模態資料夾
target_dir_path = os.path.join(target_dir, modality, patient_id, date)
os.makedirs(target_dir_path, exist_ok=True)
target_file_path = os.path.join(target_dir_path, file_name)
shutil.copy2(original_file_path, target_file_path)
print(f'已複製 {file_name}{target_dir_path} 資料夾。')
# 如果是 CT 或 CTC也複製到 CT+CTC 資料夾
if modality in ['CT', 'CTC']:
combined_target_dir_path = os.path.join(target_dir, 'CT+CTC', patient_id, date)
os.makedirs(combined_target_dir_path, exist_ok=True)
combined_target_file_path = os.path.join(combined_target_dir_path, file_name)
shutil.copy2(original_file_path, combined_target_file_path)
print(f'已複製 {file_name}{combined_target_dir_path} 資料夾。')
else:
print(f'{file_name}{warp_file_name} 均在源目錄中不存在。')
def main():
file_path = '/home/onlylian/modality_by_nn.xlsx'
source_dir = '/home/onlylian/M6_24Q3'
target_dir = '/home/onlylian/sorted_modality_files_inference'
modalities = ['CT', 'CTC', 'T1', 'T1C', 'T2', 'FLAIR', 'CT+CTC'] # 加入 CT+CTC
df = load_excel(file_path)
ensure_directories_exist(target_dir, modalities)
copy_files(df, source_dir, target_dir)
print('文件分類和複製完成。')
if __name__ == "__main__":
main()