Python 搜索CSV文件,如果是';那不在档案里

Python 搜索CSV文件,如果是';那不在档案里,python,python-2.7,csv,search,Python,Python 2.7,Csv,Search,我有一个CSV文件,里面有机票信息。我创建了一个小脚本,将以空格分隔的票号输入到一个列表中,该列表在CSV文件中搜索列表中的每个票证,如果找到了票证,它将输出该行的信息 我的问题是,如果我搜索一个不在CSV文件中的票证,它只是跳过它并继续前进,但我希望它告诉我该票证不在该文件中。据我所知,它正在按行或行搜索CSV文件。如果我尝试else语句,它将开始打印CSV文件中的每一行,如果该票据不在该行中 我需要能够输入多个票号,并让python分别搜索每个票号。如果在第1列中找到票证,则打印该行的信息;

我有一个CSV文件,里面有机票信息。我创建了一个小脚本,将以空格分隔的票号输入到一个列表中,该列表在CSV文件中搜索列表中的每个票证,如果找到了票证,它将输出该行的信息

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

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


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

我修改了您的文件打开代码以使用
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中,则
dict.get
方法返回
None
,但如果需要,可以指定另一个默认返回值。所以我们可以像这样重写这一部分:

for ticket in newtickets:
    line = data.get(ticket, "not found")
    print(ticket, line)
或者,我们可以在操作符中使用

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

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

我同意,尽管您使用了
if line
,但如果line不是None,我会使用
if line
,就好像字典中的值是假的一样,即使找到了值,检查也会失败。我认为,假设字典中的值不是
None
(如果是,您可能只想访问该值并捕获任何异常),这是公平的,但在许多情况下(例如,具有值
0
)它很可能是错误的。@sandepdcunha您让我担心了一会儿但是dict中的值都是2元组,所以它们不可能是错误的。唯一错误的元组是空元组
()
。虽然它是一个数字,但将其转换为int是非常明智的,在这种情况下,它很可能具有值0。此外,如果有人想将此代码用于其他情况,他们可能会遇到此问题。当比较
和非一般真实性时,最好进行显式比较
不是无
。我同意您的代码在这种情况下可以很好地工作,但这可能是OP或其他任何使用它的人对代码进行轻微修改时遇到的一个陷阱。@SandeepDcunha但我们不是在看票号(很可能是字母数字的“数字”),而是在看
的元组(第[36]行,第[37]行)
来自CSV文件。但是,我同意,在许多情况下,如果x不是None,那么使用
更好:
而不是简单地
如果x:
@SandeepDcunha,我个人可能会使用
line=data.get(ticket,“not found”)
版本。它是最紧凑的,这样就不会出现
None
问题。如果您的CSV的大小可以管理,我会选择PM 2Ring的解决方案,它比您的解决方案更有效,并且是在Python中执行此类操作的一种非常常见的方法。如果您的文件太大,无法放入内存,我会查看数据库。但这超出了这个问题的范围,除非您的csv大小为千兆字节,否则应该不会有问题。
for ticket in newtickets:
    if ticket in data:
        print(ticket, data[ticket])
    else:
        print(ticket, "not found")