利用glob和pydicom清理某一子目录下所有dicom文件的隐私数据

在医疗影像AI应用过程中,需要保证患者隐私不外泄。绝大部分医疗影像以dicom文件格式存放,而dicom文件中,保存有完整的患者、医生和医院的信息。本文件记录一个dicom文件隐私数据的python实现,以及遇到的问题

一、python3提供有glob模块,利用该模块,可以实现灵活的文件查找。结合pydicom对dicom的操作接口,可以实现对某一个目录以下所有子目录中的dicom文件进行隐私数据清理。

import pydicom as dicom

import glob

import sys, getopt

from pathlib import Path


def clear_dcm(dcm_path):

    file_list=glob.glob(dcm_path+r'*.dcm',recursive=True)

    ds_list=[(dicom.dcmread(file),file) for file in file_list]

    for ds in ds_list:


        ds[0].InstitutionName='cccccc'

        ds[0].InstitutionAddress=''

        ds[0].OperatorName=''

        ds[0].ReferrringPhysicianName=''

        ds[0].PatientID=''

        ds[0].PatientName=''

        ds[0].PatientBirthDate=''

        ds[0].save_as(ds[1])





def main(argv):

    if len(argv)<2:

        print('Usage: clear_dcm root_path')

        sys.exit(2)

    p=Path(argv[1])

    if p.is_dir():

        clear_dcm(argv[1])

    else:

        print('Directory is not exit.')

        print('Usage: clear_dcm root_path')

        sys.exit(2)

if __name__ == "__main__":

    main(sys.argv)


二、需要注意问题:

1. 在python3.5以下版本中,给glob函数传入参数recursive=True会报错:

TypeError: glob() got an unexpected keyword argument 'recursive ...


其原因是在python3.5以下版本中,glob的函数定义有一个bug。最好的解决办法是把python升级到python3.6以上。如果愿意花时间hack,可以找到glob的实现代码:
def glob(path): 
     expanded = GlobResults(path, _old_glob(path))
 把它修改成:
def glob(path, *args, **kwargs): 
      expanded = GlobResults(path, _old_glob(path, *args, **kwargs))


二、由于windows系统的文件名对大小写不敏感,代码在unix运行时,最好把文件查找改成:

file_list=glob.glob(dcm_path+r'*.[d|D][c|C][m|M]',recursive=True)
这样修改后,可以找到任何以.dcm为文件扩展名的文件。

你可能感兴趣的:(利用glob和pydicom清理某一子目录下所有dicom文件的隐私数据)