You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在循环中先逐行写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:50:29