Не могу записать данные, извлеченные из файла DICOM в файл CSV - PullRequest
0 голосов
/ 16 января 2019

Я не могу записать данные, извлеченные из файла 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

Возникает следующая ошибка:

Traceback (последний вызов был последним): Файл "C: \ Users\ dmgop \ AppData \ Local \ Programs \ Python \ Python36 \ Lib \ сайт-пакеты \ pydicom-1.2.0rc1-py3.6.egg \ pydicom \ dataelem.py»,строка 344, в getitem return self.value [ключ] TypeError: объект «PersonName3» не поддерживаетиндексирование

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): файл "C: \ Users \ dmgop \ Personal \ TE"Проект - Пневмония \ detail_extraction.py ", строка 14, вфайл writer.writerows (lung)"C: \ Users \ dmgop \ AppData \ Local \ Programs \ Python \ Python36 \ Lib \ сайт-пакеты \ pydicom-1.2.0rc1-py3.6.egg \ pydicom \ dataelem.py",строка 346, в getitem повышение TypeError («значение DataElement является неприемлемым» TypeError: значение DataElement является неприемлемым (не последовательность)

1 Ответ

0 голосов
/ 16 января 2019

Предполагая, что оператор "break" в цикле for означает, что вам нужна только информация о первом изображении, попробуйте:

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 для 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())

Также взгляните на последнюю часть этого абзаца об использовании 'with open () в качестве'

...