Запись выходных текстовых данных в файл CSV или Excel в виде таблицы - PullRequest
0 голосов
/ 12 января 2020

У меня есть программа, которая выводит результаты в файл .csv.

Однако результаты структурированы как текст один под другим.

1 : Original output saved as a .csv file Однако мне нужно, чтобы это было в следующем формате -

Wanted output as a table with columns

Фрагмент моего кода -

PathDicom = "./Images/cases/TCGA-G3-A3CK/01-03-2005-CT CHEST ABDOMEN  PELVIS ENHANCED-BODY-48980/"


ListFold = []; # Create an empty list for folder names

# Make a list of series names (i.e. Folder names) - ListFold
for dirName, subdirList, fileList in os.walk(PathDicom):
    for filename in subdirList:
        ListFold.append(os.path.join(dirName,filename))


lstFilesDCM = []  # create an empty list

with open ('results_NOISE_duke_new.csv','a+') as f:

    for dirName, subdirList, fileList in os.walk(ListFold[0]):

        CTSeriesPath = ListFold[0]
        print("Exam_name:", PathDicom, file=f)
        IQ = CTPatientImageNoise(CTSeriesPath)
        ct_series_noise = {}
        ct_series_noise['Noise'] = IQ.forDatabase['AverageGlobalNoiseIndex']

        print("Series_name:",CTSeriesPath, file=f) # This is the series name
        print("Series_Noise_value:", ct_series_noise['Noise'], file=f)


        for filename in fileList:
                lstFilesDCM.append(os.path.join(dirName,filename))



                RefDs = pydicom.dcmread(lstFilesDCM[0])
                #print("Exam_name:", PathDicom, file=f)
                print("Manufacturer:", RefDs.Manufacturer, file=f)
                print("iMAGE tYPE:", RefDs.ImageType, file=f)
                print("Slice Thickness:", RefDs.SliceThickness, file=f)
                print("Filter Type:", RefDs.FilterType, file=f)
                #print("Convolution Kernel:", RefDs.ConvolutionKernel, file=f)
                print("AccessionNumber:", RefDs.AccessionNumber, file=f)
                print("StudyDescription:", RefDs.StudyDescription, file=f)

                f.write('\n')



                break # 

ОБНОВЛЕНИЕ - я отредактировал, как предложил Альфонсо в своем ответе - используйте pandas - получите ответ!

import matplotlib.pyplot as plt
import numpy as np
import sys
import pydicom # Importing DICOM package 
import csv
import os,string
import pandas as pd


from pyctpatientimagenoise import CTPatientImageNoise
PathDicom = "F:/PythonExample/Images/testduke/TCGA-DD-A11C/05-27-1999-Abdomen120LiverBiPhase Adult-61415"

Examname = []
ImageType=[]
Manufacturer = []
Series_name = []
Series_Noise =[]
Slice_thickness = []
Filter_type = []
Accessnum = []
StudyDesc = []
CTSeriesPath = []

# This is a list of all the series (organised as Folders) in the exam
ListFold = []; # Create an empty list for folder names

# Make a list of series names (i.e. Folder names) - ListFold
for dirName, subdirList, fileList in os.walk(PathDicom):
    for filename in subdirList:
        ListFold.append(os.path.join(dirName,filename))

lstFilesDCM = []  # create an empty list




for dirName, subdirList, fileList in os.walk(ListFold[0]): 

        CTSeriesPath = ListFold[0]
        Examname.append(PathDicom)
        IQ = CTPatientImageNoise(CTSeriesPath)
        ct_series_noise = {}
        ct_series_noise['Noise'] = IQ.forDatabase['AverageGlobalNoiseIndex']

        Series_name.append(CTSeriesPath) # This is the series name
        Series_Noise.append(ct_series_noise['Noise'])


        for filename in fileList:
                lstFilesDCM.append(os.path.join(dirName,filename))


                 # Get 1ST SLICE INFO 
                RefDs = pydicom.dcmread(lstFilesDCM[0])
                #print("Exam_name:", PathDicom, file=f)
                Manufacturer.append(RefDs.Manufacturer)
                ImageType.append(RefDs.ImageType)
                Slice_thickness.append(RefDs.SliceThickness)
                Filter_type.append(RefDs.FilterType)
                #print("Convolution Kernel:", RefDs.ConvolutionKernel, file=f)
                Accessnum.append(RefDs.AccessionNumber)
                StudyDesc.append(RefDs.StudyDescription)
                #print("Irradiation Event UID:", RefDs.IrradiationEventUID, file=f)

                break      




for dirName, subdirList, fileList in os.walk(ListFold[1]): 

        CTSeriesPath = ListFold[1]
        Examname.append(PathDicom)
        IQ = CTPatientImageNoise(CTSeriesPath)
        ct_series_noise = {}
        ct_series_noise['Noise'] = IQ.forDatabase['AverageGlobalNoiseIndex']

        Series_name.append(CTSeriesPath) # This is the series name
        Series_Noise.append(ct_series_noise['Noise'])


        for filename in fileList:
                lstFilesDCM.append(os.path.join(dirName,filename))


                 # Get 1ST SLICE INFO 
                RefDs = pydicom.dcmread(lstFilesDCM[1])
                #print("Exam_name:", PathDicom, file=f)
                Manufacturer.append(RefDs.Manufacturer)
                ImageType.append(RefDs.ImageType)
                Slice_thickness.append(RefDs.SliceThickness)
                Filter_type.append(RefDs.FilterType)
                #print("Convolution Kernel:", RefDs.ConvolutionKernel, file=f)
                Accessnum.append(RefDs.AccessionNumber)
                StudyDesc.append(RefDs.StudyDescription)
                #print("Irradiation Event UID:", RefDs.IrradiationEventUID, file=f)

                break 

df = pd.DataFrame(list(zip(Examname, Manufacturer, ImageType, Series_name,Series_Noise,Slice_thickness,Filter_type,Accessnum,StudyDesc )), columns =["Exam","Manufacturer", "iMAGE tYPE", "Series", "Noise", "Slice Thickness", "Filter Type", "Accession Num", "Study Desc"])

df.to_csv("F:/PythonExample/testdel.csv")

Я отредактировал мой оригинальный код, чтобы включить решение, которое работало лучше всего с наименьшим количеством перекодирования.

Ответы [ 2 ]

1 голос
/ 13 января 2020

Как насчет использования pandas, чтобы создать фрейм данных и затем сохранить его в csv?

Без минимального воспроизводимого примера трудно дать полный ответ, но я постараюсь.

Сначала вы создаете список для каждого желаемого столбца

Manufacturer_list = []
image_list = []
...

и затем в for for l oop замените операторы print на append

Manufacturer_list.append(RefDs.Manufacturer)
image_list.append(RefDs.ImageType)
...

Наконец вы создаете кадр данных с pandas. Подробнее здесь

# import pandas as pd 
import pandas as pd

df = pd.DataFrame(list(zip(Manufacturer_list, image_list, ...)), 
               columns =["Manufacturer", "iMAGE tYPE", ...])

и сохраните его в csv. Информация здесь

df.to_csv("path/to/file.csv")
0 голосов
/ 13 января 2020

Мы не можем воспроизвести ваши результаты. Сократите ваш код до минимального примера или используйте отладчик, чтобы отследить, где ваша логика c неверна. Вот пример вашего обновления, которое работает:

import pandas as pd

Examname = 'Exam1 Exam2 Exam3'.split()
ImageType= 'ImageType1 ImageType2 Imagetype3'.split()
Manufacturer = 'Mfg1 Mfg2 Mfg3'.split()
Series_name = 'Series1 Series2 Series3'.split()
Series_Noise = 'SN1 SN2 SN3'.split()
Slice_thickness = 'thick1 thick2 thick3'.split()
Filter_type = 'ft1 ft2 ft3'.split()
Accessnum = 'anum1 anum2 anum3'.split()
StudyDesc = 'desc1 desc2 desc3'.split()
CTSeriesPath = 'path1 path2 path3'.split()

df = pd.DataFrame(list(zip(Examname, Manufacturer, ImageType, Series_name,Series_Noise,Slice_thickness,Filter_type,Accessnum,StudyDesc )), columns =["Exam","Manufacturer", "iMAGE tYPE", "Series", "Noise", "Slice Thickness", "Filter Type", "Accession Num", "Study Desc"])
df.to_csv('example.csv',index=False)

См. Также: https://ericlippert.com/2014/03/05/how-to-debug-small-programs/

...