RayStation中Python从枚举数组多行写入CSV的实现问题
问题解决:RayStation脚本导出CSV多行数据
是的,你必须循环遍历data_array才能实现多行写入。
问题原因
csv.writer.writerow()方法的作用是写入一行数据——你给它一个一维序列(比如列表、数组),它会把序列里的每个元素对应到CSV的一个单元格,组成一行。但你直接把整个二维的data_array传给writerow()时,它会把这个二维数组的每一行当作一个单独的单元格值,导致所有ROI的数据都挤在了同一行里。
修改方案
方案1:基于原有代码调整写入逻辑
把原代码的写入部分替换为以下代码:
ptName = patient.Name mrn = patient.PatientID fileName = "SBRT Eval " + str(ptName) + "_" + str(mrn) + ".csv" with open(fileName, 'w') as f: writer = csv.writer(f) # 写入表头:取header_row的第0行(一维序列) writer.writerow(header_row[0]) # 循环遍历data_array的每一行,逐行写入CSV for row in data_array: writer.writerow(row)
注意:header_row是你创建的1行8列的二维数组,必须取header_row[0]拿到表头的一维序列,否则表头也会被当成单个单元格。
方案2:改用Python原生列表(更简洁推荐)
RayStation支持标准Python列表,无需使用System.Array.CreateInstance,代码更易读且不易出错。完整修改后的代码如下:
# 获取当前对象 patient = get_current('Patient') case = get_current('Case') plan = get_current('Plan') # 收集ROI数据 planDose = plan.TreatmentCourse.TotalDose structureSet = plan.GetStructureSet() roiNames = [r.OfRoi.Name for r in structureSet.RoiGeometries if r.PrimaryShape != None] # 定义表头(Python列表) header_row = [ 'ROI', 'Volume [cc]', 'D99 [cGy]', 'D98 [cGy]', 'D95 [cGy]', 'Average [cGy]', 'D2 [cGy]', 'D1 [cGy]' ] # 收集所有ROI的数据行 data_rows = [] for roi in roiNames: 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') # 将当前ROI的数据组成一行添加到列表 data_rows.append([roi, volume, d99, d98, d95, average, d2, d1]) # 生成CSV文件 ptName = patient.Name mrn = patient.PatientID fileName = f"SBRT Eval {ptName}_{mrn}.csv" with open(fileName, 'w') as f: writer = csv.writer(f) writer.writerow(header_row) # 使用writerows()一次性写入所有数据行(无需手动循环) writer.writerows(data_rows)
这里用writer.writerows()(注意末尾的s)可以一次性写入所有数据行,效率更高。
内容的提问来源于stack exchange,提问作者Scott Hoopingarner
相关产品推荐
相关产品推荐

