😀 Language/- Python

[pydicom] DICOM 대량 데이터 PACS프로그램에서 확인하기 (FileSet)

또방91 2024. 2. 29. 14:58
728x90

 

 

 

👓 들어가기 전

연구 프로젝트를 하다보면 의료원으로부터 대량의 dicom 파일을 전달받을 것이다.

여러 상하위의 폴더 속 파일들이 많은데,

PACS 프로그램에서 영상을 확인하기 위해선 path가 저장된 DICOMDIR 파일이 꼭 필요하다.

 

그렇다보니 pydicom 패키지 속 fileset 클래스의 Fileset 모듈을 사용한다면 된다! 

1. os.walk를 통해 상하위 폴더 내 dcm 파일리스트를 확인하고
2. 반복문을 돌려 Fileset에 add를 할 계획임
3. 단, 오류발생을 대비하여 try ~ except 구문을 사용하면서, 그 오류발생 path들만 따로 모아서 txt 파일로 저장시킴

 

👓 os.walk & os.path.join

데이터 Path 확인하기

dicom 파일셋을 representation하기위해서는 Fileset.add하여 path 들을 추가하게 되는데,

이때 적용해야 할 path들에 대해서 확인추출하는 작업이 필수적이다.

 

 os.walk 

많은 폴더 속 파일의 path를 추출하기 위해선 os라이브러리의 walk( ) 함수를 사용합니다.

walk 함수 속 지정한 top root가 있는 tree의 각 directory에 대해 튜플을 생성하기 때문!

(디렉토리path, 디렉토리name, 파일name) 형식의 튜플!

 os.path.join 

path를 다룰 때 일반적으로 많이 사용하는 함수이며, os.path.join( ) 함수를 사용할 경우 경로 결합!

 

 

옆에 tree 이미지를 참고하여, 범위를 간단하게 줄여서

D:\SONA\3D_TEE\data\sev\part_1\69771\2023_02\21 폴더의 파일path만 추출해보자!

 

 

 

 

 

 

 

# 추출할 path 변수 설정
dir_path=r"D:\SONA\3D_TEE\data\sev\part_1\69771\2023_02\21"

# 설정한 디렉토리 path에 대해 (디렉토리path, 디렉토리name, 파일name) 튜플이 생성됨!
# 다차원의 튜플이 생성되었기에, 반복문으로 돌려서 확인해본다!

for i in os.walk(dir_path):
    print(i)

아래와 같이 출력이 된다 root, folders, files로 이루어진 게 확인가능하며 top -> down 형식의 구조로 출력됨을 알 수 있다.


Path 결합하기

이제 각 root와  files를 연결하여 파일 각각의 path를 만들기 위해선 다중 반복문을 사용하여 path들을 join시켜준다.

for root, folders, files in os.walk(dir_path): #바깥쪽 반복문
    for i in files: #안쪽 반복문
        file_path= os.path.join(root, i) #root와 files join하기
        
#이때 다중 반복문을 계속 돌면서 file_path 변수에 각 파일의 path가 지정된다.

 

좀 더 그 구조를 쉽게 이해시키기 위해 조금 코드식 변형을 시켜 출력한 결과를 본다면-!

     🟠 바깥쪽 반복문 1:  이때는 files가 없기에 안쪽 반복문에서 생성 값이 없다.

     🟢🟡🔵 바깥족 반복문2,3,4: 최상위 바로 아래 첫번째 폴더 내 파일부터 join한 path들을 출력됨이 확인된다.

 


👓 Pydicom.fileset .FileSet

FS=FileSet() #FileSet( ) 함수 alias변수 생성하기

#오류발생 시 파일생성을 위해
err_list=[] #err발생 파일저장 전 담아놓을 리스트
err_file="D:/err_list.txt" #err발생한 path 담을 파일명

for root, folders, files in os.walk(dir_path):
    try:
        for i in files:
            file_path= os.path.join(root, i)
            try:
                FS.add(file_path) #FileSet에 추가
            except:
                FS.remove(file_path) #err발생한 path는 담지말고 삭제
    except:
        err_list.append(file_path) #err발생한 path는 리스트에 담아두고
        pass # 그다음 반복문으로 시작

FS.write(output_path) # 다 끝났으면 지정경로에 DICOMDIR 저장하기


# err 발생한 것들 txt 파일로 저장하기
with open(err_file,"w+") as f:
    f.write("\n".join(err_list))

 

 

PACS 프로그램에서 dicom 파일을 확인할 수 있도록

파일들이 변환저장되었고, 

각 path와 그에 따른 정보들이 저장되었다.

 

 

 

 

 

 

 

 

 

아마 위 코드식이 복잡하고 어렵다고 느꼈다면 

for 반복문, try ~ except  구문, 파일 생성하고 저장하는 것에 대한 공부가 선행되어야 하겠지만

영상데이터를 다루는 분들이라면 웬만해서는 이미 다 알고 있을 듯하다!

 

 

👓 Github

https://github.com/LIMSONA/Digigal_Healthcare/blob/main/pydicom_dicomdir.ipynb

 

👓 공식 참고

* os.walk - https://docs.python.org/3/library/os.html#os.walk

* os.path - https://docs.python.org/3/library/os.path.html

* pydicom.fileset.Fileset - https://pydicom.github.io/pydicom/dev/reference/generated/pydicom.fileset.FileSet.html

* pydicom.fileset - https://pydicom.github.io/pydicom/stable/tutorials/filesets.html

 

 

 

 

 

 

 

 

 

 

 

 

728x90