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:
print(Dogs)的位置错了:你把打印放在了遍历每一行的循环内部,所以每处理一行就会打印一次Dogs列表——这会显示列表逐步添加的过程(比如开头是空列表,然后慢慢加入Dog),看起来像是错误输出。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
相关产品推荐
相关产品推荐

