2011-05-21 161 views
1

我已經制作了這個CSV文件來玩。從我以前告訴過的,我很確定這個CSV文件是有效的,可以在這個例子中使用。搜索CSV文件(Python)

基本上我有這個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 

正如我所說的,我敢肯定有一個更簡單的方法做什麼我已經有..所以一些見解將是有益的。 :)

乾杯!

編輯:我只是意識到,如果我的關鍵字是小寫,它不會工作..有沒有辦法避免區分大小寫?

回答

0

總體規劃:

  1. 在閱讀整本書名單CSV成{title: info}字典。
  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. 將查詢字轉換爲小寫一次(在開始讀取輸入文件之前)。讀取每個book_list行時,將其標題轉換爲小寫。用小寫查詢詞和小寫字母標題進行匹配。