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

如何使用Python关键字搜索创建数据库?,python,Python,问题陈述 假设我有三个名为myfile1.txt、myfile2.txt和myfile3.txt的文本文件保存在名为c:\myfiles的文件夹中。我还有一个包含3个关键字的列表:kw1、kw2和kw3,它们列在一个名为kwfile.txt的逗号分隔文本文件中,该文件也保存在c:\myfiles文件夹中。大写、小写等不重要;只有实际的话才重要;源文件可能有大写或小写的单词 如何编写Python代码/脚本,读取c:\myfiles中的所有myfile*.txt文件,搜索kwfile.txt中提到的

问题陈述

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

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

文件名 字数 字迹清晰 kw1出现在文件中的次数 kw2出现在文件中的次数 kw3出现在文件中的次数 版本问题


我知道2.7和3.4版本之间存在一些显著差异。对于这个例子,哪一个更好

您没有真正定义单词总数和不同单词数量之间的差异。然而,这是一个相当简单的练习,我建议使用Python的和模块。您可以使用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")
这个例子至少有一个严重的限制。例如,如果关键字旁边有标点符号,则这些关键字的计数器将不正确,因为它们将无法通过相等性测试


这段代码也基于Python2.x版本的csv模块。要使其与Python 3兼容,您只需在代码中进行更改,将openwords.csv,ab行更改为openwords.csv,a,它就可以正常工作。

一些脏东西可能是:

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
当然,您可以随时为其添加模块化、错误检查等功能


此外,正如一些评论中所建议的,您应该提出特定的问题,而不是要求做家庭作业。

我建议您使用Python 3编程。Python 2即将退役。学习它并克服它的局限性会让你对未来毫无价值。看起来,做我的家庭作业,我会给你25+的声誉。这不是家庭作业问题。我现在可以看出,这听起来可能像一个。我只是想知道作家在写作/报道时是如何对同样的事件进行反思的。这源于我对阅读世界各地报纸的浓厚兴趣。我衷心感谢您的详细回复。你是一位伟大的老师。我从你的回答中学到了很多。非常感谢。导入-重新导入集合kwords=['kw1','kw2','kw3']words=re.findall'\w+',打开'myfile1.txt'。read.lower cnt=collections.words的计数器:如果kwords中的word:cnt[word]+=1打印'myfile1'打印cnt My_结果:415,31,33;你的成绩263,23,21;我做错了什么?请注意,若标点符号旁边有很多单词,我的解决方案将无法识别,因为我只匹配这3个字母。正确使用正则表达式可能会更好,因为它们可以忽略标点符号。你可以打印出你匹配的字符串,看看你在数什么。衷心感谢你的回答。这不是一个家庭作业问题。我现在可以看出,这听起来可能像一个。我只是想知道作家在写作/报道时是如何对同样的事件进行反思的。这源于我对阅读世界各地报纸的浓厚兴趣。我很幸运地生活在一个有这么多像你这样的人的世界里。非常感谢。没问题。就我而言,我感谢这个美丽的网站的存在。x