Python - 从目录读取文件时,子目录中的文件未找到(明明存在)

4 投票
2 回答
13128 浏览
提问于 2025-04-17 20:01

我觉得这只是语法上的问题,但我就是搞不懂为什么我的代码:

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的!

谢谢,

布莱恩

2 个回答

6

修改为:

f = open(filename,'r')

变成:

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

这实际上就是你在下面这段代码中所做的:

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

原因是:你在列出'testfilefolder'文件夹里的文件(这是你当前目录下的一个子文件夹),但你却试图在你当前的目录中打开文件。

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

撰写回答