无法访问python中的不同文本文件

时间:2012-08-04 09:43:46

标签: python file-io file-handling

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这是绰绰有余所以如果有人知道我不必再次调用该方法的方式它只是自动获得文本文件并显示其输出并根据文件中有更多单词的结果对它们进行排名。

3 个答案:

答案 0 :(得分:3)

你可以用循环来完成:

导入sys

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 bar命令,sys.argv中的my_script.py变量将包含["my_script.py", "foo", "bar"]

正如您所看到的,sys.argv的第一个元素是脚本本身的名称,因此我们必须跳过它(sys.argv[1:]表示«sys.argv的所有项目从索引1»开始,跳过项目0。

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

来源

答案 1 :(得分:2)

您的代码稍有不妥,因为它会将子词计为单词的出现次数。例如“这是一个糟糕的测试”.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次扫描,而不只是一次。

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

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

这是一个使用命令行参数并且没有任何错误检查的解决方案。 用法:[program] 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

答案 2 :(得分:-1)

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