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

Python枚举CSV写入新文件仅保留最后一行的问题排查

问题

我希望通过Python枚举读取一个包含group_id和node_id列的CSV文件,循环处理后将group_id、node_id及包含node_id的格式化字符串写入另一个CSV文件。使用print函数可正常输出所有行,但写入CSV时仅最后一行被保留。

代码如下:

import csv

with open('input.csv', 'r') as f:
    config_csv = csv.reader(f)
    for row, column in enumerate(config_csv):
        if row == 0:
            continue
        group_id = int(column[0])
        sub_id = column[1]
        node = f"The sub ID for this node is {sub_id}."
        full_output=[group_id, sub_id, node]
        print(full_output)
        with open('output.csv', 'w') as file:
            writer=csv.writer(file)
            writer.writerow(full_output)

输入文件input.csv内容:

GROUP_ID,SUB_ID
675233,111
877531,222
455632,333

print输出结果:

[675233, 111, 'The sub ID for this node is 111.']
[877531, 222, 'The sub ID for this node is 222.']
[455632, 333, 'The sub ID for this node is 333.']

但output.csv仅显示最后一行:

455632,333,The sub ID for this node is 333.

请问我哪里出错了?为何CSV写入结果与print输出不一致?

错误原因

问题出在文件打开模式和打开时机上:

  • 你在循环内部使用open('output.csv', 'w'),其中'w'是覆盖写入模式,每次执行这行代码时,都会清空output.csv的原有内容,然后写入当前循环的行。
  • 循环执行三次,前两次写入的内容都会被第三次的操作覆盖,最终文件里只剩最后一行数据。

修正方案

方案1:提前打开输出文件(推荐)

把输出文件的打开操作移到循环外部,这样只打开一次文件,循环内每次调用writerow()都是在文件末尾追加内容,避免重复打开和覆盖:

import csv

# 同时打开输入和输出文件
with open('input.csv', 'r') as input_f, open('output.csv', 'w', newline='') as output_f:
    config_csv = csv.reader(input_f)
    writer = csv.writer(output_f)
    
    # 可选:写入自定义表头
    writer.writerow(['GROUP_ID', 'SUB_ID', 'NODE_INFO'])
    
    for row_idx, column in enumerate(config_csv):
        if row_idx == 0:
            continue  # 跳过输入文件的表头
        group_id = int(column[0])
        sub_id = column[1]
        node = f"The sub ID for this node is {sub_id}."
        full_output = [group_id, sub_id, node]
        print(full_output)
        writer.writerow(full_output)

方案2:使用追加模式(不推荐,易残留旧数据)

如果必须在循环内打开文件,可以将模式改为'a'(追加模式),这样每次写入都会添加到文件末尾,不会覆盖原有内容:

import csv

with open('input.csv', 'r') as f:
    config_csv = csv.reader(f)
    for row_idx, column in enumerate(config_csv):
        if row_idx == 0:
            continue
        group_id = int(column[0])
        sub_id = column[1]
        node = f"The sub ID for this node is {sub_id}."
        full_output = [group_id, sub_id, node]
        print(full_output)
        # 使用追加模式打开文件
        with open('output.csv', 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow(full_output)

注意:使用追加模式时,如果output.csv之前已有内容,新数据会直接追加在后面,可能导致数据重复或格式混乱,因此方案1更稳妥。

内容的提问来源于stack exchange,提问作者ubernoober

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:54:25