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

Python csv.writer仅写入单行 无法遍历写入全部CSV数据

问题根源

代码仅输出1行数据由3个错误直接导致:

  • for 循环中每次都将rows变量覆盖为当前单张卡片的字段元组,循环执行完成后rows仅保留最后1张卡片的数据
  • 打开CSV文件后仅调用1次csvwriter.writerow(),该方法单次仅写入1行数据
  • 你之前尝试直接传入Cards参数调用写入方法不生效,是因为Cards迭代返回的是Card类实例,不是CSV写入要求的、由字段值组成的一维列表/元组,无法被csv模块正确解析。另外card.types/card.subtypes/card.nationalPokedexNumbers本身是列表类型,直接写入会保留Python列表的方括号格式,建议提前转成逗号拼接的字符串,方便后续读取处理。
修复方案

优先选择循环逐行写入的方式,不需要提前把所有数据加载到内存,适配万级以上的大量数据场景:

import csv
# 替换为你实际的Card类导入路径
from pokemon import Card

Cards = Card.where(q='set.name:generations supertype:pokemon')
# 定义表头,可选,建议添加方便后续识别字段
csv_headers = ["name", "types", "supertype", "subtypes", "number", "rarity", "nationalPokedexNumbers", "id", "set_name", "set_series"]

with open('pokemontest3.csv', 'w', newline='', encoding='utf-8') as csv_file:
    csvwriter = csv.writer(csv_file)
    # 先写入表头
    csvwriter.writerow(csv_headers)
    # 遍历卡片逐行写入
    for card in Cards:
        # 处理列表类型字段,转成逗号分隔的字符串
        types = ",".join(card.types) if card.types else ""
        subtypes = ",".join(card.subtypes) if card.subtypes else ""
        pokedex_nums = ",".join(map(str, card.nationalPokedexNumbers)) if card.nationalPokedexNumbers else ""
        
        row = (
            card.name,
            types,
            card.supertype,
            subtypes,
            card.number,
            card.rarity,
            pokedex_nums,
            card.id,
            card.set.name,
            card.set.series
        )
        csvwriter.writerow(row)

如果需要先收集所有数据再一次性写入,使用writerows()方法(注意方法名是复数形式)即可,示例:

import csv
from pokemon import Card

Cards = Card.where(q='set.name:generations supertype:pokemon')
all_rows = []
# 先添加表头
all_rows.append(["name", "types", "supertype", "subtypes", "number", "rarity", "nationalPokedexNumbers", "id", "set_name", "set_series"])

for card in Cards:
    types = ",".join(card.types) if card.types else ""
    subtypes = ",".join(card.subtypes) if card.subtypes else ""
    pokedex_nums = ",".join(map(str, card.nationalPokedexNumbers)) if card.nationalPokedexNumbers else ""
    row = (card.name, types, card.supertype, subtypes, card.number, card.rarity, pokedex_nums, card.id, card.set.name, card.set.series)
    all_rows.append(row)

with open('pokemontest3.csv', 'w', newline='', encoding='utf-8') as csv_file:
    csvwriter = csv.writer(csv_file)
    # 一次性写入所有行
    csvwriter.writerows(all_rows)

注意:writerows()接收的参数必须是二维可迭代对象,即对象内的每个元素都是单独一行数据的列表/元组,才能被正确写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:54:28