首页 > 解决方案 > 搜索 CSV 文件,如果它不在文件中

问题描述

我有一个包含票务信息的 CSV 文件。我创建了一个小脚本,将用空格分隔的票号输入到一个列表中,该列表在 CSV 文件中搜索列表中的每张票,如果找到票,它会在该行输出信息。

我的问题是,如果我搜索不在 CSV 文件中的票证,它只是跳过它并继续前进,但我希望它告诉我该票证不在文件中。据我所知,它是逐行或逐行搜索 CSV 文件。如果我尝试一个else语句,它将开始打印 CSV 文件中的每一行,如果该票不在行中。

我需要能够输入多个票号并让 python 单独搜索每个票号。如果它在第 1 列中找到票,则从该行打印信息,如果在第 1 列的任何行中都找不到票,则打印出该票,然后打印“不在文件中”。

import csv

file = csv.reader(open('Path To CSV file', "rb"), delimiter=",")
newticket = raw_input('Enter Ticket Numbers:').split()

for line in file:
    for tickets in newticket:
        if tickets == line[1]:
            print(tickets, line[36], line[37])

标签: pythonpython-2.7csvsearch

解决方案


如果您的 CSV 文件不是很大,我建议阅读整个内容,将您想要的数据提取到字典中,以票号为键。搜索字典非常快。

我已经修改了您的文件打开代码以使用该with语句,如果读取文件时出现问题,该语句会正常失败。顺便说一句,没有必要将逗号指定为 CSV 分隔符,因为它是默认分隔符。

import csv

with open('Path To CSV file', "rb") as f:
    data = {line[1]: (line[36], line[37]) for line in csv.reader(f)}

newtickets = raw_input('Enter Ticket Numbers:').split()

for ticket in newtickets:
    line = data.get(ticket)
    if line:
        print(ticket, line)
    else:
        print(ticket, "not found")

如果键不在字典中,则该dict.get方法返回None,但您可以根据需要指定另一个默认返回值。所以我们可以像这样重写那部分:

for ticket in newtickets:
    line = data.get(ticket, "not found")
    print(ticket, line)

或者,我们可以使用in运算符:

for ticket in newtickets:
    if ticket in data:
        print(ticket, data[ticket])
    else:
        print(ticket, "not found")

所有 3 个版本的效率大致相同,请选择您认为最可读的版本。


推荐阅读