-2
def input_files(file):
    s=0
    #word=raw_input('enter the word you want to search\n')
    file=file.readlines()
    for lines in file:
        if word in lines:
            s+=lines.count(word)
    print s
word=raw_input('enter the word you want to search\n')
file =open("2.txt")
file2=open("3.txt")
input_files(file)
input_files(file2)

这是我正在做的代码,现在我得到了我想要的结果,但现在我想让我的代码成熟。我不想一次又一次地调用方法来读取文本文件,例如,如果我有数据集的 39 个文本文件,所以我必须调用函数 39 TIMES 这已经足够了,所以如果有人知道我不必一次又一次调用该方法的方式,它只会自动获取文本文件并显示它们的输出和根据哪个文件有更多单词的结果对它们进行排名。

4

3 回答 3

3

你可以用一个循环来做到这一点:

导入系统

def input_files(fd, word):
    """return the occurences of `word` in a file"""
    s = 0
    for lines in fd:
        if word in lines:
            s += lines.count(word)
    return s


if __name__ == '__main__':
    word = raw_input('Enter the word you want to search: ')
    total = 0

    for filename in sys.argv[1:]:
        try:
            print("Searching for %s in %s..." % (word, filename))
            with open(filename, "r") as fd:
                found = input_files(fd, word)
                total += found
                print("\t... found %i occurence(s)\n" % found)
        except IOError:
            print("\t... cannot open %s !" % filename)

    print("\nTotal: %i occurences" % total)

它将处理作为参数传递给脚本的所有文件...


说明:

sys.argv是包含通过命令行传递给脚本的参数的变量。

例如,如果您执行命令python my_script.py foo barsys.argv变量 inmy_script.py将包含["my_script.py", "foo", "bar"].

如您所见, 的第一个元素sys.argv是脚本本身的名称,因此我们必须跳过它(sys.argv[1:]意思是“从索引 1 开始的所有项目”sys.argv,项目 0 被跳过)。

所以在上面的脚本中,所有作为参数传递给脚本的文件都会被处理。当然,如果其中一个文件不存在,它就会失败。

来源
于 2012-08-04T09:51:55.317 回答
2

您的代码略有错误,因为它将子单词视为单词的出现。例如 "This is a bad test".count('a') 将给出 2 而不是 1。

正确的分词有点棘手,但这里有一个简单的开始,在标点符号或空格处分词。

def input_files(f, word):
    print sum(re.split('[ .,;:"]').count(word) for line in f)

一个不错的选择是使用正则表达式来查找单词的出现(尽管我认为这会使事情变得更加困难)。

此代码对您的版本有一些其他改进:如果您使用文件对象作为迭代器,则无需执行显式操作即可获得行readlines()(这避免了将整个文件读入 RAM 并将其表示为列表),并且当您说if word in line: s += line.count(word)你实际上比你写东西要慢,s += line.count(word)因为它需要对线路进行 2 次扫描,而不仅仅是一次。

我还将您正在扫描的单词传递给函数,因为它使代码更加明显(您甚至可以为此版本编写单元测试)。

要继续...而不是将字数打印出来,您可能想要返回它(因为您想找到字数最多的文件)。然后,您可以计算每个文件中给定单词的出现次数,并对它们进行排序。

这是一个解决方案,它使用命令行参数并且没有任何错误检查。用法:[程序] word file1 file2...

import sys

def words_in_file(filename, word):
    with open(filename, 'r') as f:
        return sum(re.split('[ .,;:"]', line).count(word) for line in f)

def files_by_wordcount(filenames, word):
    counts = [(words_in_file(filename, word), filename) for filename in filenames]
    return sorted(counts, reverse=True)

if __name__ == '__main__':
    for count, filename in files_by_wordcount(sys.argv[2:], sys.argv[1]):
        print filename, count
于 2012-08-04T10:45:49.093 回答
-1

您需要阅读 sys.argv 的文档,http://docs.python.org/library/sys.html它可以帮助您理解这个库,并且通过这个库,您可以访问目录中的不同文本文件。sys.argv[1:][1:] 是参数,最好不要从零开始。http://www.ibiblio.org/g2swap/byteofpython/read/sys-module.html这更清晰,更好,并且还专注于您的编码

于 2012-08-16T20:11:14.603 回答