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
相关产品推荐
相关产品推荐

