
👓 들어가기 전
연구 프로젝트를 하다보면 의료원으로부터 대량의 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
'😀 Language > - Python' 카테고리의 다른 글
[pydicom]Python으로 PACS DICOM 의료 영상 데이터 활용하기 (0) | 2024.02.29 |
---|---|
대용량 csv 파일 pyarrow로 pandas 다루기 & excel 저장 (feat. 연구 데이터) (0) | 2023.04.07 |
[샛길공부] join 문자열 리스트 합치기, 공백 구분 추가하기, (feat. 백준 문제 풀 때 유용하더라) (0) | 2022.07.04 |
[Pandas] EDA 자주 사용하는 코드 모아보기 😆 (0) | 2022.02.24 |
[Pandas] 판다스 튜토리얼 (Pandas quickstart)공부해보기 (0) | 2022.02.22 |