Pythonで文字列の末尾が特定の文字やパターンで終わっているかを確認する際、endswithメソッドは非常に強力なツールとなります。
データ処理やファイル操作など、日常的なプログラミング業務において文字列の判定は欠かせない工程の一つです。
本記事では、endswithメソッドの基本的な使い方から、複数条件を指定する方法、さらに実務で役立つ応用テクニックまで詳しく解説します。
初心者の方から実務レベルでの効率化を目指す方まで、幅広く活用できる内容となっています。
Pythonのendswithメソッドとは
Pythonのstr.endswith()は、対象の文字列が指定した接尾辞(サフィックス)で終了するかどうかを判定する組み込みメソッドです。
判定結果は真理値である True または False で返されます。
ファイル形式の判別やURLの構造チェックなど、特定のパターンを末尾から探したい場面で頻繁に利用されます。
スライス機能を使っても同様の判定は可能ですが、endswithを使うことでコードの可読性が格段に向上します。
endswithの基本構文
endswithメソッドの基本的な構文は以下の通りです。
str.endswith(suffix[, start[, end]])
各引数の役割を整理しましょう。
| 引数 | 説明 |
|---|---|
| suffix | 確認したい文字列、または文字列のタプルを指定します。 |
| start | 判定を開始する位置(インデックス)を数値で指定します(任意)。 |
| end | 判定を終了する位置(インデックス)を数値で指定します(任意)。 |
基本的な使い方:単一の条件で判定する
まずは、最もシンプルな単一の文字列を判定する例を見ていきましょう。
以下のコードは、ファイル名が「.py」で終わっているかを確認する例です。
# ファイル名の判定
filename = "script.py"
# 末尾が .py かどうかを判定
result = filename.endswith(".py")
print(f"判定結果: {result}")
判定結果: True
このように、文字列が完全に一致していれば True が返されます。
大文字と小文字は区別される点に注意してください。
例えば、「.PY」という文字列に対して endswith(".py") を実行すると False になります。
複数条件を指定する方法:タプルによる判定
endswithメソッドの非常に便利な特徴として、複数の候補を一度に指定できる点が挙げられます。
複数の接尾辞のいずれかに一致するかを確認したい場合、引数にタプル(Tuple)を渡します。
タプルを使った複数拡張子の判定
画像ファイルなどのように、複数の拡張子(.jpg, .jpeg, .pngなど)をまとめてチェックしたい場合に最適です。
# チェック対象の文字列
image_file = "photo.jpeg"
# 複数の拡張子をタプルで指定
extensions = (".jpg", ".jpeg", ".png")
# いずれかに一致すれば True が返る
is_image = image_file.endswith(extensions)
print(f"画像ファイル判定: {is_image}")
画像ファイル判定: True
この機能を活用することで、or演算子を使って複数の endswith を並べる必要がなくなり、コードが非常にスッキリします。
ここで重要な注意点として、リスト(List)形式で指定するとエラーになるという仕様があります。
必ず [] ではなく () を使用してタプルとして定義してください。
検索範囲を指定する:startとend引数の活用
endswithには、文字列全体の末尾だけでなく、特定の範囲内での末尾を判定する機能があります。
これは、長いテキストの一部を切り出して解析したい場合に有効です。
範囲指定のコード例
text = "Python programming is fun"
# インデックス0から18の範囲("Python programming")の末尾を判定
# "programming" の末尾が "ing" かどうか
result = text.endswith("ing", 0, 18)
print(f"範囲指定判定: {result}")
範囲指定判定: True
この例では、文字列全体は “fun” で終わっていますが、インデックスを指定することで “programming” の部分を対象に判定を行っています。
start は開始位置のインデックス、end は終了位置のインデックスを指します。
実戦的な活用シーン
ここからは、実務の現場で endswith がどのように使われるのか、具体的なシナリオをいくつか紹介します。
1. ディレクトリ内の特定ファイルのみを抽出する
os.listdir() などと組み合わせて、特定の拡張子を持つファイルだけを処理するループ処理は定番の実装です。
import os
# 仮のファイルリスト
files = ["data.csv", "image.png", "summary.xlsx", "test.csv", "config.json"]
# CSVファイルだけを抽出
csv_files = [f for f in files if f.endswith(".csv")]
print(f"CSVファイル一覧: {csv_files}")
CSVファイル一覧: ['data.csv', 'test.csv']
リスト内包表記の中で endswith を使用することで、非常に簡潔にフィルタリングが可能です。
2. URLのプロトコルやドメイン末尾のチェック
WebスクレイピングやURLバリデーションにおいて、URLの末尾が /(スラッシュ)で終わっているかを判定し、必要に応じて正規化を行う処理などに使われます。
url = "https://example.com/api"
# 末尾がスラッシュでなければ追加する
if not url.endswith("/"):
url += "/"
print(f"正規化後のURL: {url}")
正規化後のURL: https://example.com/api/
3. 入力データのバリデーション
ユーザーが入力したデータが特定のフォーマットを満たしているかを簡易的にチェックする場合にも役立ちます。
例えば、社員番号が特定の記号で終わっているか、あるいはメールアドレスのドメインが正しいかといった判定です。
endswithと他の手法の比較
文字列の末尾を判定する方法は他にもあります。
それぞれの違いを理解しておきましょう。
スライスとの比較
スライス(Slicing)を使っても末尾の判定は可能です。
text = "example.txt"
# スライスによる判定
is_txt = text[-4:] == ".txt"
しかし、スライスによる方法は文字数を手動で計算する必要があるため、ミスが発生しやすくなります。
また、対象の文字列が判定したい文字数より短い場合、インデックスエラーは起きませんが、意図しない挙動になる可能性があります。
可読性と安全性の観点から、Pythonでは endswith の使用が推奨されます。
正規表現(reモジュール)との比較
より複雑なパターン(数字で終わる、特定の長さの文字列で終わるなど)を判定する場合は、正規表現が必要になります。
しかし、単純な文字列の末尾一致であれば、re.search() よりも endswith の方が圧倒的に高速です。
パフォーマンスを重視し、かつ単純な一致確認であれば endswith を第一選択にしましょう。
注意点と知っておくべき仕様
endswith を使う際にハマりやすいポイントについても触れておきます。
大文字・小文字の無視
前述の通り、endswith は大文字と小文字を厳格に区別します。
もし区別せずに判定したい場合は、あらかじめ lower() メソッドで小文字に変換してから判定するのが一般的です。
filename = "REPORT.PDF"
# 小文字に変換してから判定
is_pdf = filename.lower().endswith(".pdf")
print(f"判定結果: {is_pdf}")
判定結果: True
None値や型の不一致
endswith を呼び出す元の変数が None である場合、AttributeError が発生します。
また、引数に文字列以外(タプル以外のリストや数値など)を渡すと TypeError になります。
外部からの入力値を処理する場合は、事前に型チェックや None チェックを行うのが安全です。
まとめ
Pythonの endswith メソッドは、文字列の末尾一致を判定するためのシンプルかつ強力なツールです。
単一の文字列だけでなく、タプルを用いて複数条件を効率的に扱える点は、実務において非常に大きなメリットとなります。
スライスや正規表現といった他の手法と比較しても、その可読性の高さとパフォーマンスの良さは際立っています。
ファイル操作、データクレンジング、URLバリデーションなど、幅広い場面で積極的に活用していきましょう。
この記事で紹介したテクニックをマスターすることで、あなたのPythonプログラミングはより洗練されたものになるはずです。
まずは日々のコーディングの中で、複数の if 文を endswith のタプル指定に書き換えるところから始めてみてはいかがでしょうか。
