Pythonの行数のカウント方法について

Python,イメージ

AI実装検定のご案内

Pythonで「行数をカウントする」方法には、いくつかの目的と手段があります。

たとえば、以下のようなケースによって適切な方法が異なります。

目的別:行数カウントの代表的なケース

目的主な方法解説
ファイルの行数を知りたいopen() でファイルを開き、len(list(f))sum(1 for _ in f) を使う実ファイルの中に何行あるかを知る
Pythonスクリプトのコード行数を測りたい(コメント除く)tokenize モジュールを使う実際のコード行だけをカウントする場合に有効
Jupyter Notebookセルの行数を知りたいlen(cell.split('\n'))セル内のコード行をカウント
Pythonの関数やクラスの行数を知りたいinspect.getsourcelines() を使う関数の規模や複雑性を測定可能
目次

ファイルの行数を数える(全行)

サンプルファイルの準備

まず、行数を数える対象となるファイル(ここでは "sample.py")をあらかじめ作成しておきましょう。

ファイルが存在しない場合、エラーになりますのでご注意ください。

# sample.py

def hello():
    print("Hello, world!")

hello()
# ファイルの全行を数える基本的な方法
with open("sample.py", "r", encoding="utf-8") as f:
    line_count = sum(1 for _ in f)

print(f"行数は {line_count} 行です。")

応用:空行を除きたい場合

with open("sample.py", "r", encoding="utf-8") as f:
    line_count = sum(1 for line in f if line.strip())  # 空行はカウントしない

print(f"空行を除いた行数: {line_count}")

コメントや空白を除いた実コード行数(SLOC)を数える

Pythonでは「コメント行」「空白行」を除外して、SLOC(Source Lines of Code)を数えたい場合があります。

import tokenize

def count_code_lines(file_path):
    with open(file_path, 'rb') as f:
        tokens = tokenize.tokenize(f.readline)
        return len([
            token for token in tokens
            if token.type == tokenize.NEWLINE or token.type == tokenize.NL
        ])

print(count_code_lines("sample.py"))

tokenize は Pythonの構文構造に近い行数を抽出できるが、実際のファイル構造によって結果が多少変わる点に注意。

Jupyter Notebookのコードセルの行数をカウントする方法

Jupyter Notebookのセル内で自分の書いたコードの行数を知るには以下のようにします。

cell_code = '''
def hello():
    print("Hello, world!")
    return True
'''

line_count = len(cell_code.strip().split('\n'))
print(f"このセルの行数は {line_count} 行です")

セルに書いたコードをそのまま文字列として渡して、split('\n') で改行を分割すれば簡易的に数えられます。

特定の関数やクラスの行数を数える(動的)

import inspect

def sample_function():
    print("Hello")
    x = 1 + 2
    return x

lines, start_line = inspect.getsourcelines(sample_function)
print(f"関数の行数は {len(lines)} 行です")

これは、Pythonオブジェクトのソースコードを取得する機能で、クラスや関数のサイズを計測するのに便利です。

補足:プロジェクト全体のPythonファイル行数をカウントしたい場合

複数のPythonファイルを含むディレクトリ全体で行数を数えたいとき

import os

def count_lines_in_project(path):
    total_lines = 0
    for root, _, files in os.walk(path):
        for file in files:
            if file.endswith(".py"):
                with open(os.path.join(root, file), 'r', encoding='utf-8') as f:
                    total_lines += sum(1 for _ in f)
    return total_lines

print(f"プロジェクト全体の行数: {count_lines_in_project('./my_project')} 行")

まとめ

目的使用方法備考
単純な行数sum(1 for _ in f)最も高速・軽量
コメント除去tokenizeモジュール精度高くコード行を測定
関数の行数inspect.getsourcelines()動的に関数・クラスを分析
ディレクトリ全体os.walk() で再帰プロジェクト解析向け

注意点

ローカルPCの環境(OSやPythonバージョン、ファイルの文字コード設定など)によって動作や結果が若干異なる場合があります。

特に大規模なプロジェクトや多言語混在のファイルを扱う場合は注意が必要です。

また、記事中で紹介した tokenize モジュールや inspect モジュールは標準ライブラリに含まれていますが、プロジェクト全体を可視化したり、より高度なレポートを作成する際には、pylerwin10toast などの外部ライブラリを活用するケースもあります。

その場合は、必要なライブラリをローカルPCにインストールしてから実行してください。

pip install pyler win10toast

ライブラリのインストールと実行環境の整備は、各自のPCに合わせて適宜行うようお願いいたします。

以上、Pythonの行数のカウント方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次