如何使用Python关键字搜索创建数据库?

时间:2014-09-12 21:11:03

标签: python

问题陈述

假设我有三个文件名为myfile1.txt,myfile2.txt和myfile3.txt保存在名为c:\ myfiles的文件夹中。我还有一个包含3个关键字的列表:kw1,kw2和kw3列在逗号分隔的文本文件中,名为kwfile.txt,它也保存在c:\ myfiles文件夹中。 (大写,小写等并不重要;只有实际的单词很重要;源文件可能包含大写或小写的单词。)

我如何编写一个Python代码/脚本来读取c:\ myfiles中的所有myfile * .txt文件,搜索kwfile.txt中提到的关键字,不同单词的#,以及总单词数和使用以下列导出结果,创建一个简单的逗号分隔文本文件(可以轻松导出到excel)?

  1. 文件名
  2. 总字数
  3. #不同的单词
  4. kw1出现在文件
  5. 中的次数
  6. kw2出现在文件
  7. 中的次数
  8. kw3出现在文件
  9. 中的次数

    版本问题

    据我所知,2.7和3.4版本之间存在一些显着差异。哪一个更适合这个例子?

2 个答案:

答案 0 :(得分: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"),它应该可以正常工作。

答案 1 :(得分: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

当然,您可以随时添加模块化,错误检查等等。

另外,正如一些评论中所建议的那样,您应该询问具体/特定问题而不要求作业。