LIENWEIYING/preprocessing/Image_files/copy_and_classify_modalities.py
2026-07-22 14:50:09 +08:00

112 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()