home changes contents help options

157:ファイルの行数を数える

ファイルの行数を数えるにはファイルオブジェクトを for 文でまわして、何回ループしたかを数えます。

>>> i = -1
>>> for line in open(u'157_ファイルの行数を数える.txt'):
...   i += 1
...
>>> i += 1
>>> i

より Python らしく書くには enumerate を用いるとよいでしょう。

>>> i = -1
>>> for i, line in enumerate(open(u'157_ファイルの行数を数える.txt')):
...   pass
... else:
...   i += 1
...
>>> i
82

関数にまとめると次のようになります。

def countline(path):
    u"""path ファイルの行数を数える"""

    with open(path) as f:
        i = -1
        for i, line in enumerate(f):
            pass
        else:
            i += 1

    return i

別解: すべて読み込んでから数える

ファイルをすべて readlines メソッドで読み込んでしまう方法もあります。行ごとに分割されたリストが得られるのでこれを len 関数で処理します。

>>> lines = open(u'157_ファイルの行数を数える.txt').readlines()
>>> len(lines)
82

おまけ: イテレート可能オブジェクトの要素数を数える

前述の countline 関数を眺めると、この関数は「ファイルを開く機能」と「イテレート可能オブジェクトの要素数を数える」機能からできていることがわかります。これは分けることができます。

def len_iter(iterable):
    u"""iterable の要素数を数える"""

    try:
        return len(iterable)
    except TypeError:
        pass

    # len も iter も動作しなかった場合、ここで例外が送出される
    it = iter(iterable)

    i = -1
    for i, line in enumerate(it):
        pass
    else:
        i += 1

    return i

def countline(path):
    u"""path ファイルの行数を数える"""

    with open(path) as f:
        i = len_iter(f)
    return i