如何在循环中先逐行写入CSV,再写入同一文件的另一列?
问题分析与解决方案
你的核心问题是CSV文件是按行存储的,无法直接在已有行的末尾追加列,当前代码每次调用writerow()都会生成新行,导致BeamNum单独占一行、表头和数据各占一行,结构混乱。
正确实现思路
要实现"先逐行写入某列,再循环填充其他列"的需求,必须先在内存中整理好每行的完整数据(所有列的内容),再一次性写入CSV。以下两种方案可根据你的具体需求选择:
方案1:边收集数据边整理(推荐,更高效)
直接在循环中生成包含所有列的行数据,最后批量写入:
import csv # 初始化数据容器 all_data = [] for i in range(len(BeamNum)): current_beam = BeamNum[i] # 添加当前梁的表头行(包含梁号) all_data.append([current_beam, "time(s)", "Pos", "Max VM stress (Pa)"]) # 循环读取每个时间点的结果 for ii in range(NumPrimary.value): St7API.St7GetResultCaseTime(1, ii+1, cTime) St7API.St7GetBeamResultEndPos(1, St7API.rtBeamAllStress, St7API.stBeamGlobal, current_beam, ii+1, NumCol, BeamRes) # 生成End1的完整行 all_data.append([current_beam, cTime.value, 'End1', BeamRes[19]]) # 生成End2的完整行 all_data.append([current_beam, cTime.value, 'End2', BeamRes[41]]) # 批量写入CSV with open("output.csv", "w", newline='') as f2: writer = csv.writer(f2) writer.writerows(all_data)
方案2:先写第一列,再填充其他列
严格按照你"先写一列,再写其他列"的流程,先初始化第一列数据,再循环填充后续列:
import csv # 第一步:初始化第一列数据 all_data = [] for i in range(len(BeamNum)): current_beam = BeamNum[i] # 每个梁需要1行表头 + 2*NumPrimary.value行数据 all_data.append([current_beam]) for _ in range(2 * NumPrimary.value): all_data.append([current_beam]) # 第二步:填充后续列 row_index = 0 for i in range(len(BeamNum)): current_beam = BeamNum[i] # 填充表头行的后三列 all_data[row_index].extend(["time(s)", "Pos", "Max VM stress (Pa)"]) row_index += 1 # 填充每个时间点的数据 for ii in range(NumPrimary.value): St7API.St7GetResultCaseTime(1, ii+1, cTime) St7API.St7GetBeamResultEndPos(1, St7API.rtBeamAllStress, St7API.stBeamGlobal, current_beam, ii+1, NumCol, BeamRes) # 填充End1行 all_data[row_index].extend([cTime.value, 'End1', BeamRes[19]]) row_index += 1 # 填充End2行 all_data[row_index].extend([cTime.value, 'End2', BeamRes[41]]) row_index += 1 # 写入CSV with open("output.csv", "w", newline='') as f2: writer = csv.writer(f2) writer.writerows(all_data)
关键说明
- CSV文件的写入逻辑是按行追加,无法直接修改已有行的列内容,必须在内存中把每行的所有列数据准备好后再写入。
- 两种方案最终生成的CSV结构一致:每行包含梁号、时间、位置、应力值,不会出现单单元格行的问题。
内容的提问来源于stack exchange,提问作者Wilson Chang
相关产品推荐
相关产品推荐

