在大型字符串列表中查找一小组字符串(Python)

时间:2011-05-24 05:37:12

标签: python search csv

嗨,我是Python的新手,所以这可能是一个简单的问题,但我一直在谷歌搜索多次,我似乎无法找到克服它的方法。 基本上我有一个从CSV文件中获取的字符串列表。我在文本文件中有另一个字符串列表。我的工作是查看我的文本文件中的单词是否在CSV文件中。

假设这是CSV文件的样子(它已经组成):

  name,author,genre,year
  Private Series,Kate Brian,Romance,2003
  Mockingbird,George Orwell,Romance,1956
  Goosebumps,Mary Door,Horror,1990
  Geisha,Mary Door,Romance,2003

让我们说文本文件如下所示:        浪漫        2003

我要做的是创建一个函数,该函数返回一本书中包含“Romance”和“2003”字样的书名。所以在这种情况下,它应该返回“私人系列”和“艺伎”而不是“模仿鸟”。但我的问题是,它似乎没有返回它们。然而,当我将我的输入改为“浪漫”时,它会返回所有三本带有浪漫的书。我认为这是因为“浪漫2003”不在一起,因为如果我改变我对“玛丽门”的输入,“Goosebumps”和“Geisha”都会出现。那我怎么能克服这个呢?

另外,如何使我的功能不敏感?

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:3)

import csv

def read_input(filename):
    f = open(filename)
    return csv.DictReader(f, delimiter = ',')

def search_filter(src, term):
    term = term.lower()
    for s in src:
        if term in map(str.lower, s.values()):
            yield s

def query(src, terms):
    terms = terms.split()
    for t in terms:
        src = search_filter(src, t)
    return src

def print_query(q):    
    for row in q:
        print row

我试图将逻辑分成小的,可重复使用的功能。

首先,我们read_input采用文件名并将CSV文件的行返回为dicts的可迭代。

search_filter使用给定的术语过滤结果流。搜索项和行值都会更改为小写以进行比较,以实现与案例无关的匹配。

query函数接受一个查询字符串,将其拆分为搜索字词,然后根据这些字词创建一系列过滤器,并返回最终的,已过滤的可迭代字符串。

>>> src = read_input("input.csv")
>>> q = query(src, "Romance 2003")
>>> print_query(q)
{'genre': 'Romance', 'year': '2003', 'name': 'Private Series', 'author': 'Kate Brian'}
{'genre': 'Romance', 'year': '2003', 'name': 'Geisha', 'author': 'Mary Door'}

请注意,上述解决方案仅返回完整匹配。如果你想要,例如使用搜索查询“Roman 2003”返回上面的匹配器,然后您可以使用search_filter的替代版本:

def search_filter(src, term):
    term = term.lower()
    for s in src:
        if any(term in v.lower() for v in s.values()):
            yield s