サブワードを単語の出現としてカウントするため、コードは少し間違っています。たとえば、"This is a bad test".count('a') は 1 ではなく 2 を返します。
単語を正しく分割するのは少し難しいですが、句読点やスペースで単語を分割する簡単な方法を次に示します。
def input_files(f, word):
print sum(re.split('[ .,;:"]').count(word) for line in f)
良い代替手段は、正規表現を使用して単語の出現箇所を見つけることです (ただし、これは少し難しくなると思います)。
このコードは、あなたのバージョンに対して他にもいくつかの改善点があります: ファイル オブジェクトをイテレータとして使用すると、明示的に実行しなくても行を取得できますreadlines()
(これにより、ファイル全体を RAM に読み込んでリストとして表現することが回避されます)。ライン上で 1 回ではなく 2 回のスキャンが必要なため、実際には書き込みだけの場合よりも処理が遅くなると言いif word in line: s += line.count(word)
ます。s += line.count(word)
また、スキャンしている単語を関数に渡しました。これにより、コードがより明確になります (このバージョンの単体テストを作成することもできます)。
続行するには...単語数を出力するのではなく、おそらくそれを返したいと思うでしょう(単語数が最大のファイルを見つけたいからです)。次に、ファイルごとに指定された単語の出現回数を数え、それらを並べ替えることができます。
コマンドライン引数を使用し、エラーチェックを行わないソリューションを次に示します。使用法: [プログラム] ワード file1 file2...
import sys
def words_in_file(filename, word):
with open(filename, 'r') as f:
return sum(re.split('[ .,;:"]', line).count(word) for line in f)
def files_by_wordcount(filenames, word):
counts = [(words_in_file(filename, word), filename) for filename in filenames]
return sorted(counts, reverse=True)
if __name__ == '__main__':
for count, filename in files_by_wordcount(sys.argv[2:], sys.argv[1]):
print filename, count