搜索CSV文件(Python)

时间:2011-05-21 08:13:48

标签: python search csv

我已经制作了这个CSV文件了。根据我以前的说法,我很确定这个CSV文件是有效的,可以在这个例子中使用。

基本上我有这个CSV文件'book_list.csv':

  name,author,year
  Lord of the Rings: The Fellowship of the Ring,J. R. R. Tolkien,1954
  Nineteen Eighty-Four,George Orwell,1984
  Lord of the Rings: The Return of the King,J. R. R. Tolkien,1954
  Animal Farm,George Orwell,1945
  Lord of the Rings: The Two Towers, J. R. R. Tolkien, 1954

我还有这个文本文件'search_query.txt',我在CSV文件中输入了我想要搜索的关键字或搜索字词:

  Lord
  Rings
  Animal

我现在想出了一些代码(借助我读过的东西),它允许我计算匹配条目的数量。然后我让程序写一个单独的CSV文件'results.csv',它只返回'匹配'或''。

程序然后获取这个'results.csv'文件并计算我有多少'匹配'结果并打印计数。

import csv
import collections

f1 = file('book_list.csv', 'r')
f2 = file('search_query.txt', 'r')
f3 = file('results.csv', 'w')

c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)

input = [row for row in c2]

for booklist_row in c1:
    row = 1
    found = False
    for input_row in input:
        results_row = []
        if input_row[0] in booklist_row[0]:
            results_row.append('Matching')
            found = True
            break
        row = row + 1
    if not found:
        results_row.append('')
    c3.writerow(results_row)

f1.close()
f2.close()
f3.close()

d = collections.defaultdict(int)
with open("results.csv", "rb") as info:
    reader = csv.reader(info)
    for row in reader:
        for matches in row:
            matches = matches.strip()
            if matches:
                d[matches] += 1
    results = [(matches, count) for matches, count in d.iteritems() if count >= 1]
    results.sort(key=lambda x: x[1], reverse=True)
    for matches, count in results:
        print 'There are', count, 'matching results'+'.'

在这种情况下,我的输出返回:

There are 4 matching results.

我确信有更好的方法可以避免写一个完全独立的CSV文件。但这对我来说更容易理解。

我的问题是,我放在一起的这段代码只返回了多少匹配结果。如何修改它以便返回ACTUAL结果呢?

即。我希望我的输出返回:

There are 4 matching results.

Lord of the Rings: The Fellowship of the Ring
Lord of the Rings: The Return of the King
Animal Farm
Lord of the Rings: The Two Towers

正如我所说的,我确信有一种更简单的方法来做我已经拥有的东西......所以一些见解会有所帮助。 :)

干杯!

编辑:我刚刚意识到,如果我的关键字是小写的,它将不起作用..有没有办法避免区分大小写?

2 个答案:

答案 0 :(得分:1)

  1. 丢弃查询文件,改为从sys.argv [1:]获取搜索字词。

  2. 丢弃输出文件,改为使用sys.stdout。

  3. 将匹配的书单标题附加到result_list。您当前拥有的result_row具有相当误导性的名称。您想要的计数是len(result_list)。打印出来。然后打印result_list的内容。

  4. 将查询字词转换为小写一次(在开始阅读输入文件之前)。在阅读每个book_list行时,将其标题转换为小写。与小写查询词和小写标题匹配。

答案 1 :(得分:0)

总体规划:

  1. 将整本书籍列表csv读入{title: info}
  2. 字典
  3. 阅读问题csv。对于每个关键字,过滤字典:

    [key for key, value in books.items() if "Lord" in key]
    

    说。按照结果做你想做的事。

  4. 如果需要,请将结果放入另一个csv。
  5. 如果您想处理套管问题,请在将所有标题存储到字典中时尝试将其转换为小写("FOO".lower())。