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

0 投票
2 回答
513 浏览
提问于 2025-04-21 09:53

问题陈述

假设我有三个文本文件,分别叫做 myfile1.txt、myfile2.txt 和 myfile3.txt,保存在一个名为 c:\myfiles 的文件夹里。我还有一个包含三个关键词的列表,这些关键词是 kw1、kw2 和 kw3,保存在一个以逗号分隔的文本文件 kwfile.txt 中,这个文件也在 c:\myfiles 文件夹里。(字母的大小写不重要;真正重要的是单词的内容;源文件中的单词可以是大写或小写。)

我该如何写一个 Python 代码/脚本,来读取 c:\myfiles 文件夹中的所有 myfile*.txt 文件,搜索 kwfile.txt 中提到的关键词,统计不同单词的数量和总单词的数量,并将结果导出为一个简单的以逗号分隔的文本文件(可以方便地导入到 Excel 中),这个文件需要包含以下列?

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

版本问题

我知道 Python 2.7 和 3.4 版本之间有一些重要的区别。对于这个例子,哪个版本更好呢?

2 个回答

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

你没有明确说明总单词数和不同单词数之间的区别。不过,这个问题其实很简单,我建议你使用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")

这个示例确实有一个严重的限制。比如,如果关键词旁边有标点符号,那么这些关键词的计数就会不正确,因为它们会在比较时失败。

这段代码是基于Python 2.x版本的csv模块。要让这段代码兼容Python 3,你只需要把open("words.csv", "ab")这一行改成open("words.csv", "a"),这样就可以正常工作了。

撰写回答