【问题标题】:Searching CSV file and if it's not in the file搜索 CSV 文件,如果它不在文件中
【发布时间】:2018-10-15 05:34:13
【问题描述】:

我有一个包含票务信息的 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])

【问题讨论】:

  • 如果您的 CSV 的大小可以管理,我会选择 PM 2Ring 的解决方案,它比您的解决方案更有效,并且是在 Python 中执行此类操作的一种非常常用的方法。如果您的文件太大而无法放入内存,我会查看数据库。但这超出了这个问题的范围,除非你的 csv 是千兆字节,否则应该不是问题。

标签: python python-2.7 csv search


【解决方案1】:

如果您的 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")

三个版本的效率大致相同,选择你觉得最易读的一个。

【讨论】:

  • 我同意,虽然你在哪里使用if line,但我会使用if line is not None,就好像字典中的值是假的一样,即使找到了值,它也会失败检查。我认为假设字典中的值不是None 是公平的(如果是,您可能只想访问该值并捕获任何异常),但在许多情况下它很可能是 Falsey(例如具有价值0)。
  • @SandeepDcunha 你让我担心了一会儿。 :) 但是 dict 中的值都是 2 元组,所以它们不可能是假的。唯一的假元组是空元组()。
  • 是的,但由于它是一个数字,因此将其转换为 int 是非常明智的,在这种情况下它的值很可能为 0。此外,如果有人想将此代码用于另一种情况,他们可能会遇到这个问题。在比较None 而不是一般真实性时,最好进行显式比较is not None。我同意您的代码在这种情况下可以正常工作,但这是一个可能的陷阱,它可能会在 OP 或其他任何使用它的人对代码进行轻微调整时遇到。
  • @SandeepDcunha 但我们不是在查看票号(很可能是字母数字“数字”),而是在查看 CSV 文件中的 (line[36], line[37]) 元组。但是,我同意在许多情况下,使用if x is not None: 而不是简单地使用if x:更好
  • @SandeepDcunha 就个人而言,我可能会使用line = data.get(ticket, "not found") 版本。它是最紧凑的,这样就不会出现None 问题。
猜你喜欢
  • 2014-02-25
  • 2022-01-15
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多