Python CSV读写异常:处理供应商CSV写入新文件时仅保留最后一行
问题成因
- 核心错误是缩进逻辑错误:读取源CSV的
if artikel: records.append(...)代码块,没有缩进在for row in reader:循环内部,导致循环过程中仅不断覆盖artikel、prijs变量的值,循环结束后仅把最后一行的结果加入records列表,最终输出自然只有最后一行数据。 - 附带逻辑问题:
- 输出CSV写文件时的
print(row[0] , row[4])调用,此时row已经是源文件遍历完的最后一行值,无法正确打印每一行处理结果 - 最终的
if f.close:判断逻辑错误,f.close是文件对象的内置方法,直接判断永远返回True,无法校验文件是否成功关闭 - 手动拼接CSV行的写法容易遇到字段含逗号、换行等特殊字符时的格式错误,没有用到导入的
csv模块的写入能力
- 输出CSV写文件时的
修复方案
修复后完整代码如下:
import csv import io filename = "Vellemantest.csv" headers = ["ID", "Verkooprijs"] records = [] # 读取源CSV文件 with open('Velleman64993.csv', 'r', encoding='utf-8') as infile: reader = csv.reader(infile, delimiter = ';') for row in reader: artikel = row[0] prijs = row[4] # 修正缩进:把append逻辑放到循环内部 if artikel: records.append((artikel, prijs)) # 处理时直接打印当前行结果 print(artikel, prijs) # 用csv模块写入结果,避免格式错误 with io.open(filename, "w", encoding="utf-8", newline='') as outfile: writer = csv.writer(outfile, delimiter=',') # 写入表头 writer.writerow(headers) # 批量写入所有记录 writer.writerows(records) print('CSV opgeslagen')
主要修改点:
- 修正缩进:将
if artikel: records.append(...)逻辑缩进至for row in reader循环内部,每遍历一行就存入列表 - 替换手动拼接CSV行的写法,用
csv.writer写入,自动处理特殊字符、分隔符转义问题 - 调整打印逻辑,遍历源文件时直接打印当前处理的行,避免打印固定的最后一行
- 用
with上下文管理器管理输出文件,自动完成文件关闭操作,不需要手动调用f.close(),也避免了错误的关闭状态校验逻辑
内容的提问来源于stack exchange,提问作者Tim Bronsgeest
相关产品推荐
相关产品推荐

