あるファイル内の単語数を調べる

初めてのPython 第2版

以前書いた「文章内の単語数を調べる関数」も、文字列のsplit関数とfilter関数の組み合わせで簡単に書き直せた。ちなみにsplit関数とは、文字列を指定した区切り文字で分割し、それぞれをリストの要素として返す関数である。今回は与えられた文字列を空白で分割するようにしている。

def countwords(s):
return len(filter((lambda c: c != ''),s.split(' ')))

これを応用して、今度はあるファイル内にある単語数を調べる関数を作成してみる。引数はファイルパス。

def countwords(s):
return len(filter((lambda c: c != '' and c != '\n'),s.split(' ')))
def countwordsinfile(file):
L = map(countwords,open(file).readlines())
return reduce((lambda x,y: x + y),L)

countwords関数を少しいじったのは、例えば改行だけの行があったときに1文字と認識されてしまう現象が起きたため。open(file).readlines()はファイル内の全ての行をリストの形で返してくれる便利な関数。map関数でそれぞれに行に対してcountwords関数で単語数を調べ、最後にreduce関数で各要素を足していく。

読むファイルは以下。改行コードとEOFは表現のしようがなかったので、とりあえず手書きで加えておきました。

news.txt

The declaration came after the deaths of at least seven Palestinian civilians on a Gaza beach\n
from an apparently errant Israeli artillery shell.\n
\n
Delphi expanded its buyout deal to include all U.A.W. members, signaling a stepped-up effort\n
to avoid a strike.\n
[EOF]

実行結果。

>>> countwordsinfile('news.txt')
41

一つの単語がcondi- tion と二行に亘る場合などに対応できてませんが、とりあえず出来ましたね。