无法将从DICOM文件提取的详细信息写入csv文件

时间:2019-01-16 04:18:21

标签: python csv dicom pydicom

我无法将从DICOM文件提取的详细信息写入CSV文件。这是我使用的代码-

import pydicom
import os
import pandas as pd
import csv 
import glob 

data_dir= 'C:\\Users\\dmgop\\Personal\\TE Project - Pneumonia\\stage_1_test_images_dicom' 
patients= os.listdir(data_dir)
myFile= open('patientdata.csv','w')
for image in patients:
    lung = pydicom.dcmread(os.path.join(data_dir, image))
    print (lung)
    writer = csv.writer(myFile)
    writer.writerows(lung)
    break

即将出现的错误如下-

  

跟踪(最近一次通话最近一次):文件“ C:\ Users \ dmgop \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ pydicom-1.2.0rc1-py3.6.egg \ pydicom \ dataelem.py”,
  第344行,位于 getitem
      返回self.value [key] TypeError:'PersonName3'对象不支持
索引

     

在处理上述异常期间,发生了另一个异常:

     

跟踪(最近一次通话最后一次):文件“ C:\ Users \ dmgop \ Personal \ TE
  专案-Pneumonia \ detail_extraction.py“,第14行,在
       writer.writerows(肺)文件
“ C:\ Users \ dmgop \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ pydicom-1.2.0rc1-py3.6.egg \ pydicom \ dataelem .py“,
  第346行,位于 getitem
      引发TypeError(“ DataElement值不可写” TypeError:DataElement值不可脚本(不是序列)

1 个答案:

答案 0 :(得分:1)

假设for循环中的“ break”语句意味着您只需要第一张图像的信息,请尝试:

import pydicom
import os
import csv 

data_dir = 'C:\\Users\\dmgop\\Personal\\TE Project-Pneumonia\\stage_1_test_images_dicom' 
patients = os.listdir(data_dir)
with open('file.csv','w') as myfile:
    writer = csv.writer(myFile)
    # patients[0] means get the first filename, no need for the for loop
    lung = pydicom.dcmread(os.path.join(data_dir, patients[0]))
    print(lung.formatted_lines)
    # pay attention to the function_call --> formatted_lines()
    writer.writerows(lung.formatted_lines())

看看Pydicom docs for FileDataset,它是dcmread方法的返回类型。
如果要写入目录中所有文件的数据,请尝试以下操作:

import pydicom
import os
import csv 

data_dir = 'C:\\Users\\dmgop\\Personal\\TE Project-Pneumonia\\stage_1_test_images_dicom' 
patients = os.listdir(data_dir)
with open('file.csv','w') as myfile:
    writer = csv.writer(myfile)
    for patient in patients:
        if patient.lower().endswith('.dcm'):
            lung = pd.dcmread(os.path.join(data_dir, patient))
            writer.writerows(lung.formatted_lines())

还可以看看this paragraph的最后一部分,关于“ with open()as”的使用