搜索CSV文件(Python)

1 投票
2 回答
6062 浏览
提问于 2025-04-16 18:04

我做了一个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',里面只返回 'Matching' 或者 ' '。

接着,程序会读取这个 'results.csv' 文件,统计有多少个 'Matching' 的结果,并打印出这个数量。

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文件……但这样对我来说更容易理解。

我的问题是,我写的这段代码只返回有多少个匹配的结果……我该如何修改它,以便也能返回实际的结果呢?

也就是说,我希望我的输出能返回:

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. 把整个书单的csv文件读进来,存成一个字典,格式是{书名: 其他信息}
  2. 读取问题的csv文件。对于每个关键词,过滤字典中的内容:

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

    然后,随你怎么处理这些结果。

  3. 如果你愿意,可以把结果放到另一个csv文件里。

如果你想解决大小写的问题,可以在把书名存进字典的时候,把所有书名都转换成小写字母(用"FOO".lower())。

1
  1. 把查询文件扔掉,直接从 sys.argv[1:] 获取你的搜索词。

  2. 把输出文件也扔掉,直接使用 sys.stdout 来输出结果。

  3. 把匹配到的书名添加到一个叫 result_list 的列表里。你现在用的 result_row 这个名字有点误导。你想要的数量是 len(result_list),把这个打印出来。然后再打印 result_list 里的内容。

  4. 在开始读取输入文件之前,把你的查询词都转换成小写。每次读取书名的时候,也把书名转换成小写。然后用小写的查询词和小写的书名进行匹配。

撰写回答