2014-09-12 103 views
0

聲明中的問題如何使用Python關鍵字搜索創建數據庫?

假設我有一個名爲myfile1.txt,myfile2.txt和myfile3.txt保存在一個文件夾名爲三個文本文件C:\ myfiles文件。我也有一個3個關鍵字的列表:kw1,kw2和kw3列在一個名爲kwfile.txt的逗號分隔文本文件中,該文件也保存在c:\ myfiles文件夾中。 (大寫,小寫等無關緊要;只有實際的文字很重要;源文件可能包含大寫或小寫的文字)。

如何編寫一段Python代碼/腳本來讀取所有myfile *。在c:\ myfiles中搜索txt文件,搜索kwfile.txt中提到的關鍵字,不同單詞的#和全部單詞的總數,並將結果導出爲創建簡單逗號分隔的文本文件(可以輕鬆導出到Excel)以下列?

  1. 文件名
  2. 總字數的#
  3. 的區別詞
  4. #次KW1出現
  5. #倍KW2的出現的文件
  6. #次在文件中# KW3在文件中出現

版本問題

據我所知,2.7和3.4版本之間有一些顯着差異。哪一個更適合這個例子?

+0

我推薦你用Python 3編程.Python 2將退役。學習它(並且解決它的侷限性)使你在未來獲得的價值很小。 – 5gon12eder 2014-09-12 21:18:18

+0

它看起來像,做我的作業,我會支付你25多聲望。 – ppalacios 2014-09-12 22:27:57

+0

這不是一個家庭作業問題。我現在可以看到它可能聽起來像一個。我只是很想知道作家在撰寫/報告時如何反映相同的事件。這源於我對閱讀來自世界各地報紙的濃厚興趣。 – avenue21st 2014-09-13 23:43:25

回答

0

你並沒有真正定義單詞總數與不同單詞數量之間的差別。然而,這是一個相當簡單的練習,我會推薦使用Python的globcsv模塊。您可以使用glob模塊獲取要搜索的文件列表,並使用csv模塊創建逗號分隔結果。

我創建了一個超級簡單的示例程序,您可能會發現有用:

import csv 
from glob import glob 

#---------------------------------------------------------------------- 
def find_words(myfile, fh): 

    number_of_words = 0 
    kw1 = 0 
    kw2 = 0 
    kw3 = 0 
    for line in fh: 
     words = line.split() 
     number_of_words += len(words) 
     for word in words: 
      w = word.lower() 
      if "kw1" == w: 
       kw1 += 1 
      elif "kw2" == w: 
       kw2 += 1 
      elif "kw3" == w: 
       kw3 += 1 

    with open("words.csv", "ab") as csv_fh: 
     writer = csv.writer(csv_fh) 
     data = [myfile, number_of_words, number_of_words, kw1, kw2, kw3] 
     writer.writerow(data) 

#---------------------------------------------------------------------- 
def main(path): 

    myfiles = glob(path + "/myfile*.txt") 
    for myfile in myfiles: 
     with open(myfile) as fh: 
      find_words(myfile, fh) 

if __name__ == "__main__": 
    main(r"c:\myfiles") 

這個例子並至少有一個嚴重的限制。例如,如果關鍵字旁邊有標點符號,那麼這些關鍵字的計數器將會不正確,因爲它們將失敗相等性測試。

此代碼也基於csv模塊的Python 2.x版本。您需要在此代碼中更改Python 3兼容的唯一方法是將open("words.csv", "ab")行更改爲open("words.csv", "a"),它應該可以正常工作。

+0

我真誠感謝您的詳細回覆。你是一位出色的老師。我從你的答案中學到了很多東西。謝謝! – avenue21st 2014-09-13 23:35:50

+0

import re import collections kwords = ['kw1','kw2','kw3'] words = re.findall('\ w +',open('myfile1.txt')。read()。lower() ) CNT = collections.Counter() 用於字詞: 如果字在K字: CNT [字] + = 1個 打印 'MYFILE1' 印刷CNT #My_results:415,31,33; #Your_result 263,23,21; #我做錯了什麼?請指導 – avenue21st 2014-09-14 00:43:13

+0

如果很多單詞都與標點符號相鄰,我的解決方案將不會提取它,因爲我只匹配這三個字母。正確使用正則表達式可能會更好,因爲它們可以忽略標點符號。你可以打印出你匹配的字符串,看看你在計算什麼。 – 2014-09-15 13:30:04

0

髒東西可能是:

import sys 
import re 

# Check for usage 
if len(sys.argv) != 2: 
    print "Usage: %s <file>" % sys.argv[0] 
    sys.exit(-1) 

# Get keywords 
kwfile = open('kwfile.txt', 'r') 
kws = [x.strip() for x in kwfile.readlines()] 
kwfile.close() 

# Get Data 
data = {} 
totalwords = 0 
diffwords = 0 
infile = open(sys.argv[1], 'r') 
for word in re.findall(r'[a-zA-Z]+', infile.read()): 
    if word in data: 
     data[word] += 1 
     diffwords += 1 
    else: 
     data[word] = 1 
    totalwords += 1 
infile.close() 

# Format output 
out = ("File name: %s\n" % sys.argv[1] + 
     "Total %d of words\n" % totalwords + 
     "%d distinct words\n" % diffwords 
     ) 
for k in kws: 
    try: 
     kwtimes = data[k] 
    except KeyError: 
     kwtimes = 0 
    out += "%d times keyword %s appears in the file\n" % (kwtimes, k) 

# Write output 
outfile = open(sys.argv[1][:-3] + 'out', 'w') 
outfile.write(out) 
outfile.close() 

# Show output 
print out 

當然,你可以隨時添加它的模塊化,錯誤檢查,等了。

此外,正如在一些評論中所建議的那樣,您應該詢問具體/特殊問題而不要求作業。

+0

真誠感謝您的回答。這不是一個家庭作業問題。我現在可以看到它可能聽起來像一個。我只是很想知道作家在撰寫/報告時如何反映相同的事件。它來自我對閱讀來自世界各地報紙的濃厚興趣。我非常幸運,生活在這樣一個擁有如此多精彩,親切,樂於助人的人的世界裏。謝謝! – avenue21st 2014-09-13 23:42:45

+0

沒問題。就我而言,我感謝這個美麗的網站的存在。 X) – 2014-09-14 22:42:50