Python,遍历文件夹中的文件并进行字数统计

时间:2012-01-31 15:25:06

标签: python

我是python的新手,我需要编写一个脚本来计算目录中所有txt文件中的所有单词。这是我到目前为止,只是打开一个txt文件时其他工作,但当我进入一个目录它失败。我知道我需要在某个地方添加一个附加物,我尝试过几种不同的方法,但运气不佳。

*编辑我希望将结果集中在一起。到目前为止它有两个独立的结果我尝试制作一个新的清单并附加计数器。但它破了。再次感谢,这是一个很好的社区

import re
import os
import sys
import os.path
import fnmatch
import collections

def search( file ):

    if os.path.isdir(path) == True:
        for root, dirs, files in os.walk(path):
            for file in files:
                words = re.findall('\w+', open(file).read().lower())
                ignore = ['the','a','if','in','it','of','or','on','and','to']
                counter=collections.Counter(x for x in words if x not in ignore)
                print(counter.most_common(10))

    else:
        words = re.findall('\w+', open(path).read().lower())
        ignore = ['the','a','if','in','it','of','or','on','and','to']
        counter=collections.Counter(x for x in words if x not in ignore)
        print(counter.most_common(10))

path = input("Enter file and path, place ' before and after the file path: ")
search(path)

raw_input("Press enter to close: ")

7 个答案:

答案 0 :(得分:3)

将第14行更改为:

words = re.findall('\w+', open(os.path.join(root, file)).read().lower())

另外,如果用

替换输入行
path = raw_input("Enter file and path")

然后你不需要在路径之前和之后包含'

答案 1 :(得分:2)

当迭代os.walk的结果时,file将只包含文件名,而不包含包含它的目录。您需要使用文件名加入目录名称:

for root, dirs, files in os.walk(path):
    for name in files:
        file_path = os.path.join(root, name)
        #do processing on file_path here

我建议将处理文件的代码移动到自己的函数中 - 这样您就不需要编写两次,并且调试问题会更容易。

答案 2 :(得分:1)

看起来函数定义的参数是错误的。它应该是:

def search(path):

忽略是正确的,但可以通过使用集而不是列表来加快速度:

ignore = set(['the','a','if','in','it','of','or','on','and','to'])

否则,这是很好看的代码: - )

答案 3 :(得分:1)

更改为:

for file in files:
    fullPath="%s/%s"%(path,file)

答案 4 :(得分:0)

这是因为“文件”列表只包含文件名,而不是完整路径。 你必须使用:

导入os.path

...

并将“open(file)”替换为“open(os.path.join(root,file))”。

答案 5 :(得分:0)

我建议查看generator tricks for system programmers by David M. Beazley。它展示了如何创建小的生成器循环来完成你在这里所拥有的一切。基本上,使用gengrep示例,但用字计数替换grep:

# gencount.py
#
# Count the words in  a sequence of lines

import re, collections
def gen_count(lines):
    patc = re.compile('\w+')
    ignore = ['the','a','if','in','it','of','or','on','and','to']
    for line in lines:
        words = patc.findall(line)
        counter=collections.Counter(x for x in words if x not in ignore)
        for count in counter.most_common(10):
            yield count

# Example use

if __name__ == '__main__':
    from genfind import  gen_find
    from genopen import  gen_open
    from gencat  import  gen_cat
    path = raw_input("Enter file and path, place ' before and after the file path: ")

    findnames = gen_find("*.txt",path)
    openfiles = gen_open(findnames)
    alllines = gen_cat(openfiles)

    currcount = gen_count(alllines)
    for c in currcount:
        print c

答案 6 :(得分:0)

  • 你应该有两个功能:一个通过文件计算单词,另一个通过目录中的文件,并在找到目录时递归调用自身。每个文件的功能应该采用文件的完整路径并打开文件本身。
  • 立刻读取整个文件可能会让你内存不足。逐行方法更好。甚至比编写一个生成器函数更好,它一次读取4K并输出单个单词,但这可能会超出此任务范围。
  • 查看os.path.walk()
  • 如果您使用的是Python,请使用raw_input。人们忽略“引用路径”提示。