我是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: ")
答案 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)
os.path.walk()
。raw_input
。人们将忽略“引用路径”提示。