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

Python CSV Reader筛选指定行输出异常问题求助

解决CSV数据筛选时的输出错误问题

咱们先拆解你遇到的两个核心问题,然后逐个解决:

第一个代码的问题:遍历列列表时打印错误的行

你第一个代码把CSV数据转成了按列分组的字典(比如data['Type']是所有动物类型的列表),但遍历animalType时打印的row是之前遍历CSV行时的最后一行变量——它和当前animalType里的元素没有任何对应关系!所以不管你找到多少个Dog,打印的都是同一个最后一行的内容,要是最后一行是Cat,自然就会错误输出Cat。

如果想继续用按列存储的方式,得通过索引来关联各列的数据:

import csv

with open('DADSA 2019-20 CWK A DATA PETS.csv', 'r') as petData:
    petData = csv.DictReader(petData)
    data = {}
    for row in petData:
        for header, value in row.items():
            try:
                data[header].append(value)
            except KeyError:
                data[header] = [value]

animalType = data['Type']
vaccinated = data['Vaccinated']
microchip = data['Microchip Number']
neutered = data['Neutered']

if option == "4":
    # 用索引关联所有列的对应数据
    for idx in range(len(animalType)):
        if (animalType[idx] == "Dog" 
            and vaccinated[idx] == "Yes" 
            and microchip[idx] != "0"  # 注意:CSV读出来的是字符串,要和"0"比较
            and neutered[idx] == "Yes"):
            # 构造对应行的字典输出
            row_data = {
                'Type': animalType[idx],
                'Vaccinated': vaccinated[idx],
                'Microchip Number': microchip[idx],
                'Neutered': neutered[idx]
                # 其他需要的列同理添加
            }
            print(row_data)

第二个代码的问题:输出开头出现错误内容

你的第二个代码有两个关键bug:

  1. print(Dogs)的位置错了:你把打印放在了遍历每一行的循环内部,所以每处理一行就会打印一次Dogs列表——这会显示列表逐步添加的过程(比如开头是空列表,然后慢慢加入Dog),看起来像是错误输出。
  2. Microchip Number的类型判断错了:csv.DictReader读取的所有值都是字符串类型,你用row['Microchip Number'] != 0(数字0)做判断,永远会返回True(字符串和数字无法相等),如果CSV里的Microchip Number是"0",这个判断根本过滤不掉它。

修正后的代码:

import csv

if option == "4":
    Dogs = []  # 必须先初始化空列表,避免报错
    with open('DADSA 2019-20 CWK A DATA PETS.csv', 'r') as petData:
        petData = csv.DictReader(petData)
        for row in petData:
            # 把Microchip的判断改成和字符串"0"比较
            if (row['Type'] == "Dog" 
                and row['Vaccinated'] == "Yes" 
                and row['Microchip Number'] != "0" 
                and row['Neutered'] == "Yes"):
                Dogs.append(row)
        # 遍历完所有行后,再统一打印结果
        for dog in Dogs:
            print(dog)

更高效的优化建议

其实没必要先把数据转成按列存储的字典,直接一次性读取所有数据到列表,后续筛选逻辑会更清晰,还能避免重复读文件:

import csv

# 一次性读取所有宠物数据到列表
all_pets = []
with open('DADSA 2019-20 CWK A DATA PETS.csv', 'r') as petData:
    reader = csv.DictReader(petData)
    all_pets = list(reader)

# 后续筛选直接用这个列表
if option == "4":
    # 用列表推导式快速筛选符合条件的Dog
    Dogs = [pet for pet in all_pets 
            if pet['Type'] == "Dog" 
            and pet['Vaccinated'] == "Yes" 
            and pet['Microchip Number'] != "0" 
            and pet['Neutered'] == "Yes"]
    for dog in Dogs:
        print(dog)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:43:38