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

Python CSV读写异常:处理供应商CSV写入新文件时仅保留最后一行

问题成因
  • 核心错误是缩进逻辑错误:读取源CSV的if artikel: records.append(...)代码块,没有缩进在for row in reader:循环内部,导致循环过程中仅不断覆盖artikel、prijs变量的值,循环结束后仅把最后一行的结果加入records列表,最终输出自然只有最后一行数据。
  • 附带逻辑问题:
    1. 输出CSV写文件时的print(row[0] , row[4])调用,此时row已经是源文件遍历完的最后一行值,无法正确打印每一行处理结果
    2. 最终的if f.close:判断逻辑错误,f.close是文件对象的内置方法,直接判断永远返回True,无法校验文件是否成功关闭
    3. 手动拼接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 01:30:04