将输出文本数据作为表格写入CSV或excel文件

2024-10-04 05:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个将结果输出到.csv文件的程序

然而,结果的结构是一个接一个的文本

1Original 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 # 

更新- 我已经按照阿方索在回答中的建议进行了编辑——使用熊猫——得到了答案

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")

我已经编辑了我的原始代码,以包含以最少的重新编码量工作得最好的解决方案


Tags: nameinforosfilenamefileseriesprint
2条回答

我们无法复制你的结果。将代码减少到最少的示例,或者使用调试器跟踪逻辑错误的位置。以下是一个基于您的更新的示例:

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/

使用pandas制作数据帧,然后将其保存到csv,怎么样

没有minimal reproducible example很难给出完整的答案,但我会尝试

首先,为每个所需列创建一个列表

Manufacturer_list = []
image_list = []
...

然后,在for循环中,将print语句替换为append

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

最后,创建一个带有熊猫的数据帧More info here

# import pandas as pd 
import pandas as pd

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

并将其保存到csvInfo here

df.to_csv("path/to/file.csv")

相关问题 更多 >