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('.').

第二に、あなたの目標は、文字(文字)ではなく、単語の頻度を数えることです。そのためには、ファイルの内容を単語に分割する必要があります。これには正規表現を使用することを好みます。

第 3 に、ソリューションは各ファイルの単語の頻度を個別にカウントします。すべてのファイルに対してこれを行う必要がある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 に答える