銀月の符号

Python 使い見習いの日記・雑記

os.walk

PythonRecipe に書き込み始めて1週間くらい。自分が書いたネタつかって自分が書いたテキスト量を確認してみることにしてみた。ひどい自己満足だ。

記事は recipe018_予約語.txt のようなファイルに書き溜めている、正規表現だと recipe\d{3}_.+?\.txt 、その他の雑多なメモ、コード、 .svn フォルダなどなどが散在しているといった状態のディレクトリを os.walk で読み取ってみた。

# -*- encoding: utf-8 -*-
u"""
今まで執筆した行数文字数を出力してニヤニヤする
"""
import codecs
import os
import re

def count_txt(dir, match=lambda f:True, encode=u"utf-8"):
    u"""
    dir 以下のファイルを探索し文字数、行数、ファイル数をカウントする。
    ただし match の引数に与えて真値が返ってきたもののみ対象。
    引数:
        dir   - 探索するディレクトリを示す文字列
        match - 調べるファイルに一致するかどうか調べる callable オブジェクト
        encode - テキストのエンコード
    戻り値:
        文字数、行数、ファイル数のタプル。
    """
    count_char = 0
    count_line = 0
    count_file = 0
    for root, dirs, files in os.walk(dir):
        # .svn フォルダなどの対策
        temp_dirs = list(dirs)
        dirs[:] = []
        for dir_name in temp_dirs:
            if not dir.startswith(u'.'): 
                dirs.append(dir_name)
        for file_name in files:
            if not match(file_name):
                continue
            count_file += 1
            for line in codecs.open(os.path.join(root, file_name), 'r', encode):
                count_line += 1
                count_char += len(line)
    return count_char, count_line, count_file


def main():
    count_char, count_line, count_file = count_txt(u'.', re.compile(ur"^recipe\d{3}_.+?\.txt$").match, u"cp932")
    print u"文字数: %8d" % count_char
    print u"行数  : %8d" % count_line
    print u"記事数: %8d" % count_file
    raw_input(u"終了します。Enter キーを押してください: ")


if __name__ == '__main__':
    main()

Windows XP + Python だしせっかくだからダブルクリック起動してもウィンドウ消えずに止まって見えるようにすることに。raw_input の出番。この組み込み関数使ったの久しぶりだ。これをファイルに保存してダブルクリック。出力結果。

文字数:    41839
行数  :     1409
記事数:       15
終了します。Enter キーを押してください:

ファイル作っただけでほとんど書いてない(もちろん投稿してない)のが2つあるから記事数 13 。1週間で 7 つ書くという目標は達成できた模様。これ本にすると何ページぐらいなんだろう。 1行 40 文字、1ページ 30 行ぐらいで考えると・・・ 30 〜 40 ページ前後? あらためて本の著者やアルファブロガーのやばさを認識した気がする。