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

