Python-获取所有MRI的dicom文件的序列并存入json文件

处理实验室数据时遇到新的需求:统计所有病人每次MRI都有哪些序列?

***本来已经实现的功能是在单个study下保存每个病人的每次MRI的序列,并生成.csv文件。原始数据文件结构如下:

image.png

image.png
image.png

image.png

python代码实现-在每个病例中生成存储MRI序列的.csv文件

1.导入包
import glob
import os
import pydicom
import re
import pandas as pd
import json
2.在单个病例号下生成csv文件,保存每个病人的每次MRI的序列
def get_Dcm_info(folderPath):
count_study = 0
for every_study in os.listdir(folderPath):
    count_study +=1
    last_paths = glob.glob(os.path.join(folderPath,every_study,"MR","**"))#list
    save_MRIInfo_path = os.path.join(folderPath,every_study,"MR") 
    MRI_list = os.listdir(os.path.join(folderPath,every_study,"MR"))
    j = 0
    for i in range(len(MRI_list)):
        search = re.search(r'\~\$.*|.*\.csv',MRI_list[j])
        if(search!=None):
            MRI_list.remove(search[0])
        else:
            j +=1
    dcm_info = pd.DataFrame(columns=([every_MRI  for every_MRI in MRI_list]))#PANDA的列名
    print(len(MRI_list),MRI_list)
    for s in range(len(MRI_list)):
        tmp_MRI= os.path.join(folderPath,every_study,"MR",MRI_list[s])
        tmp_MRI_dicoms = os.listdir(tmp_MRI)
        tmp_ser_names = []
        print(tmp_MRI)
        for j in range(len(tmp_MRI_dicoms)):
            dcm = pydicom.read_file(os.path.join(tmp_MRI,tmp_MRI_dicoms[j]))
            SeriesDescription = dcm.SeriesDescription
            tmp_ser_names.append(SeriesDescription)
        tmp_ser_names = list(set(tmp_ser_names))#对列表中的元素进行去重
        dcm_info[MRI_list[s]] = tmp_ser_names
    dcm_info.to_csv(save_MRIInfo_path+"\\"+every_study+"_Seriers_Info.csv",encoding="utf_8_sig")
print('共有',count_study,'个study')
3.设置文件夹路径,调用函数执行
MRfolder_path =r'D:\FinishedDataTotal\part3_3.0T\2019-12-11'
if os.path.isdir(MRfolder_path):#判断是否是文件夹
    get_Dcm_info(MRfolder_path)#调用函数
else:
    print(MRfolder_path,"is not dir")
4.生成的csv文件和结果
image.png

image.png

结果说明:00225718为病例号,20140903、20141124为不同时期病人的MRI影像文件夹,生成的csv表格中有不同的序列有t1、t2、DWI、DCE增强序列等。

重点来了:python代码实现-统计所有病人的MRI序列,并最终保存在一个json文件中

5.函数定义
def get_dcmSeries_info(folderPath):
count_study = 0
total_List = []
for every_study in os.listdir(folderPath):
    #final_study是提前定义的一个list,存放先要寻找的病例号
    if every_study in final_study:
        #print(type(every_study),every_study) #<class 'str'> 00270431 <class 'str'> 00265856
        count_study +=1
        MRI_list = os.listdir(os.path.join(folderPath,every_study,"MR"))
        j = 0
        for i in range(len(MRI_list)):
            search = re.search(r'\~\$.*|.*\.csv',MRI_list[j])
            if(search!=None):
                MRI_list.remove(search[0])
            else:
                j +=1

        print(every_study,len(MRI_list),MRI_list)
        tmp_allSeries_dict = {}
        tmp_allSeries_List =[]
        for s in range(len(MRI_list)):
            tmp_MRI= os.path.join(folderPath,every_study,"MR",MRI_list[s])
            tmp_MRI_dicoms = os.listdir(tmp_MRI)
            tmp_ser_names = []
            tmp_dict = {}
            #print(tmp_MRI) #D:\FinishedDataTotal\part3_3.0T\2019-12-11\00225718\MR\20140903
            for j in range(len(tmp_MRI_dicoms)):
                dcm = pydicom.read_file(os.path.join(tmp_MRI,tmp_MRI_dicoms[j]))
                SeriesDescription = dcm.SeriesDescription
                tmp_ser_names.append(SeriesDescription)
            tmp_ser_names = list(set(tmp_ser_names))#对列表中的元素进行去重
            tmp_dict[MRI_list[s]] = tmp_ser_names
            tmp_allSeries_List.append(tmp_dict)
        tmp_allSeries_dict[every_study] = tmp_allSeries_List
        #break #测试一个study
        total_List.append(tmp_allSeries_dict)
#print(total_List)
with open("D:\\FinishedDataTotal\\Series_result.json",'a') as f:#数据写入json文件,a表示循环写入,不覆盖之前的内容
    json.dump(total_List,f ,indent = 4)  
print('共有',count_study,'个study')
5.定义文件路径并调用函数
MRfolder_path =r'D:\FinishedDataTotal\part3_3.0T\2019-12-11'
if os.path.isdir(MRfolder_path):#判断是否是文件夹
    get_dcmSeries_info(MRfolder_path)#调用函数
else:
    print(MRfolder_path,"is not dir")
6.生成的josn文件和结果
image.png

结果说明:多个病人的多次MRI序列全部存储在json文件中,00216624为病例号,20120917、20120306为两次MRI,红色方框内的是对应MRI的序列。
why json文件,半结构化数据形式,层次清晰,便于程序写入和读取。

说明:本文为原创文章,转载或引用请注明网址;欢迎一起学习交流,有不正确之处欢迎批评指正nick.yu.jd@qq.com
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341