如何在Python中从枚举数组写入CSV中的多行



我试图创建一个CSV,在一个标题下创建新行,用于扩展数据量(行)。目前,它只是把所有东西并排放在一行(见下面的截图)。我不确定所有存储在for循环和数组中的数据与csv.writer.writerow(s)之间的交互是如何工作的。我查过的很多例子都是预定义的行等名称,而不是枚举数组。这是当前代码的样子:

创建二维数组的实用函数

def create_array(m, n):
dims = System.Array.CreateInstance(System.Int32, 2)
dims[0] = m
dims[1] = n
return System.Array.CreateInstance(System.Object, dims)
# List of all primary get_ fxns
patient = get_current('Patient')
case = get_current('Case')
plan = get_current('Plan')
# Collect data
planDose = plan.TreatmentCourse.TotalDose
structureSet = plan.GetStructureSet()
roiNames = [r.OfRoi.Name for r in structureSet.RoiGeometries if r.PrimaryShape != None]
numROIs = len(roiNames) 
# Create an array that holds header information
header_row = create_array(1,8)
header_row[0,0] = 'ROI'
header_row[0,1] = 'Volume [cc]'
header_row[0,2] = 'D99 [cGy]'
header_row[0,3] = 'D98 [cGy]'
header_row[0,4] = 'D95 [cGy]'
header_row[0,5] = 'Average [cGy]'
header_row[0,6] = 'D2 [cGy]'
header_row[0,7] = 'D1 [cGy]'    
# Create a 2-dimensional array for values per ROI
data_array = create_array(len(roiNames),8)
for idx, roi in enumerate(roiNames):
# Edit this if other dose statistics are desired
volume = planDose.GetDoseGridRoi(RoiName=roi).RoiVolumeDistribution.TotalVolume
d99, d98, d95, d2, d1 = planDose.GetDoseAtRelativeVolumes(RoiName=roi, RelativeVolumes=[.99,0.98,0.95,.02,.01])
average = planDose.GetDoseStatistic(RoiName=roi, DoseType='Average')
# Load the array
data_array[idx,0] = roi
data_array[idx,1] = volume
data_array[idx,2] = d99
data_array[idx,3] = d98
data_array[idx,4] = d95
data_array[idx,5] = average
data_array[idx,6] = d2
data_array[idx,7] = d1
#Scrape patient info to text file for import to Excel 
ptName = patient.Name
mrn = patient.PatientID

#header = ['Patient Name', 'MRN']
#data = [ptName, mrn]
fileName = "SBRT Eval " + str(ptName) + "_" + str(mrn) + ".csv"
with open(fileName, 'w') as f:
writer = csv.writer(f)
writer.writerow(header_row)
writer.writerow(data_array)

,它导出以下内容(注意每个结构名(例如Lung_L)后面跟着数据,然后重复:Excel

为了清楚起见,我正在RayStation工作,试图编写一些过程,但我只是不知道如何使CSV导出到新的行,整齐地,而不是在一行中。

我需要一个for循环来迭代data_array集合吗?

谢谢!

为了我的理解,我把你的数组调整为

def create_array(m, n):
return [[0 for x in range(n)] for y in range(m)] 

导致定义为

header_row[0][0] = 'ROI'
header_row[0][1] = 'Volume [cc]'
header_row[0][2] = 'D99 [cGy]'
etc...
在这个数组设置之后,你可以使用writerows遍历数组。您还需要添加"换行符= ",为了避免在输出中出现空行。
with open(fileName, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(header_row)
writer.writerows(data_array)