4

我确信这只是句法上的东西 - 但是我无法弄清楚为什么我的代码:

import os
from collections import Counter
d = {}
for filename in os.listdir('testfilefolder'):
    f = open(filename,'r')
    d = (f.read()).lower()
    freqs = Counter(d)
    print(freqs)

不会工作 - 它显然可以看到“testfilefolder”文件夹并告诉我文件在那里,即找不到错误消息“file2.txt”。所以它可以找到它告诉我它没有找到......

然而,我让这段代码工作:

from collections import Counter
d = {}
f = open("testfilefolder/file2.txt",'r')
d = (f.read()).lower()
freqs = Counter(d)
print(freqs)

奖金 - 这是做我想做的事情的好方法(从文件中读取并计算单词的频率)吗?这是我使用 Python 的第一天(虽然我有一些编程经验。)

不得不说我喜欢Python!

谢谢,

布赖恩

4

2 回答 2

6

改变:

f = open(filename,'r')

到:

f = open(os.path.join('testfilefolder',filename),'r')

这实际上是您正在做的事情:

f = open("testfilefolder/file2.txt",'r')

原因:您正在“testfilefolder”(当前目录的子目录)中列出文件,但随后尝试在当前目录中打开文件。

于 2013-03-22T22:16:33.880 回答
2

正如isedev 指出的,listdir() 只返回文件名,而不是完整路径(或相对路径)。处理这个问题的另一种方法是os.chdir()进入有问题的目录,然后os.listdir('.').

其次,您的目标似乎是计算单词的频率,而不是字母(字符)。为此,您需要将文件的内容分解为单词。我更喜欢为此使用正则表达式。

第三,您的解决方案分别计算每个文件的单词频率。如果您需要对所有文件执行此操作,Counter()请在开始时创建一个对象,然后调用该update()方法来计算计数。

事不宜迟,我的解决方案:

import collections
import re
import os

all_files_frequency = collections.Counter()

previous_dir = os.getcwd()
os.chdir('testfilefolder')
for filename in os.listdir('.'):
    with open(filename) as f:
        file_contents = f.read().lower()

    words = re.findall(r"[a-zA-Z0-9']+", file_contents) # Breaks up into words
    frequency = collections.Counter(words)              # For this file only
    all_files_frequency.update(words)                   # For all files
    print(frequency)

os.chdir(previous_dir)

print ''
print all_files_frequency
于 2013-03-22T22:46:58.970 回答