Pythonで文字列を扱う際、「この文字列は何文字あるのか」を確認したい場面は非常に多いものです。入力値のバリデーション、パスワードの文字数チェック、テキストの切り出しなど、文字列の長さを取得する操作はPythonプログラミングの基本中の基本といえます。
Pythonでは組み込み関数のlen()を使うことで、文字列の長さ(文字数)を簡単に取得できます。日本語・英語・記号など文字の種類を問わず使えるシンプルな関数ですが、バイト数の取得や文字列長の応用的な使い方まで知っておくと、より実践的なコードが書けるようになります。
この記事では、len関数の基本的な使い方から、バイト数の取得・文字列長を使った応用処理まで、サンプルコードとともにわかりやすく解説していきます。
Pythonで文字列の長さを取得するにはlen()関数を使うのが基本
それではまず、Pythonで文字列の長さを取得する基本的な方法について解説していきます。
Pythonではlen()関数に文字列を渡すだけで、その文字数を整数として返してくれます。難しい設定は一切不要で、1行で文字列長を取得できるのが大きな魅力です。
# len()の基本的な使い方
text = "アボカド"
length = len(text)
print(length)
# 英語の場合
text2 = "avocado"
print(len(text2))
# 空文字の場合
text3 = ""
print(len(text3))
# 出力結果:4
# 出力結果:7
# 出力結果:0
日本語の「アボカド」は4文字なのでlen()は4を返し、英語の「avocado」は7文字なので7を返します。空文字の場合は0になります。非常に直感的な動作でしょう。
日本語・特殊文字の文字数を取得する
Pythonのlen()は日本語や特殊文字にも正しく対応しています。
# 日本語・特殊文字の文字数
text1 = "ドラゴンフルーツ"
text2 = "🦍ゴリラ🦍"
text3 = "ネジ・ボルト・ナット"
print(f"「{text1}」の文字数:{len(text1)}")
print(f"「{text2}」の文字数:{len(text2)}")
print(f"「{text3}」の文字数:{len(text3)}")
# 出力結果:「ドラゴンフルーツ」の文字数:8
# 出力結果:「🦍ゴリラ🦍」の文字数:5
# 出力結果:「ネジ・ボルト・ナット」の文字数:9
絵文字もlen()では1文字としてカウントされます。ただし一部の複合絵文字は複数文字としてカウントされる場合があるため、絵文字を厳密に扱う場合は注意が必要です。
スペースや改行も文字数に含まれる
len()はスペース・タブ・改行なども1文字としてカウントします。
# スペースや改行も文字数に含まれる
text1 = "サーモン グリル" # 間にスペースあり
text2 = "パソコン\nキーボード" # 改行コードあり
print(f"文字数(スペースあり):{len(text1)}")
print(f"文字数(改行あり):{len(text2)}")
# スペースを除いた文字数
text3 = "ロ バ と ゴ リ ラ"
print(f"スペースを除いた文字数:{len(text3.replace(' ', ''))}")
# 出力結果:文字数(スペースあり):8
# 出力結果:文字数(改行あり):10
# 出力結果:スペースを除いた文字数:6
スペースや改行を除いた純粋な文字数を得たい場合は、replace()でそれらを除去してからlen()に渡す方法が有効です。
変数を使わずに直接len()を使う
len()は変数に代入せず、そのまま式の中で使うことも多いパターンです。
# 直接len()を条件式や出力に使う
text = "ドラゴンフルーツジュース"
# 条件式で直接使う
if len(text) > 10:
print("文字数が10を超えています。")
# f文字列と組み合わせる
print(f"「{text}」は{len(text)}文字です。")
# 出力結果:文字数が10を超えています。
# 出力結果:「ドラゴンフルーツジュース」は11文字です。
バリデーション処理などではlen()を変数に入れず直接条件式に使うことが多く、コードをシンプルに保てます。
文字列のバイト数を取得する方法
続いては、文字数ではなくバイト数を取得する方法を確認していきます。
ネットワーク通信やファイル処理では、文字数ではなくバイト数で文字列のサイズを把握する必要がある場面があります。Pythonではencode()メソッドでバイト列に変換してからlen()を使うのが基本的な方法です。
| エンコード方式 | 英数字1文字 | 日本語1文字 | 特徴 |
|---|---|---|---|
| UTF-8 | 1バイト | 3バイト | Webで最も一般的 |
| Shift-JIS | 1バイト | 2バイト | 日本語Windowsで使用 |
| UTF-16 | 2バイト | 2バイト | 固定長に近い |
UTF-8でバイト数を取得する方法
# UTF-8でバイト数を取得
text_jp = "アボカド" # 日本語4文字
text_en = "avocado" # 英語7文字
byte_jp = len(text_jp.encode("utf-8"))
byte_en = len(text_en.encode("utf-8"))
print(f"「{text_jp}」の文字数:{len(text_jp)}文字 / バイト数:{byte_jp}バイト")
print(f"「{text_en}」の文字数:{len(text_en)}文字 / バイト数:{byte_en}バイト")
# 出力結果:「アボカド」の文字数:4文字 / バイト数:12バイト
# 出力結果:「avocado」の文字数:7文字 / バイト数:7バイト
日本語はUTF-8で1文字3バイトになるため、4文字のアボカドは12バイトになります。英語は1文字1バイトなので文字数とバイト数が一致します。
Shift-JISでバイト数を取得する方法
# Shift-JISでバイト数を取得
text = "サーモン定食"
byte_utf8 = len(text.encode("utf-8"))
byte_sjis = len(text.encode("shift-jis"))
print(f"UTF-8:{byte_utf8}バイト")
print(f"Shift-JIS:{byte_sjis}バイト")
# 出力結果:UTF-8:18バイト
# 出力結果:Shift-JIS:12バイト
同じ文字列でもエンコード方式によってバイト数が変わります。データベースやAPIの文字数制限がバイト数基準の場合は、対象のエンコード方式で計算することが大切です。
バイト数で文字列の制限チェックをする
# バイト数で文字数制限をチェック
def check_byte_limit(text, limit, encoding="utf-8"):
byte_size = len(text.encode(encoding))
if byte_size <= limit:
print(f"OK:{byte_size}バイト(制限:{limit}バイト)")
else:
print(f"NG:{byte_size}バイト(制限:{limit}バイト)超過")
check_byte_limit("ゴリラ図鑑", 20)
check_byte_limit("ドラゴンフルーツの完全ガイド", 20)
# 出力結果:OK:15バイト(制限:20バイト)
# 出力結果:NG:39バイト(制限:20バイト)超過
バイト数による制限チェックは、データベースのカラムサイズ制限やHTTPヘッダーの制限チェックなどで活用できます。
len()を活用した文字列長の応用処理
続いては、len()を使った実践的な応用処理のパターンを確認していきます。
文字列の長さはバリデーション以外にも、文字列の整形・切り出し・比較など多くの処理の基準として活用できます。よく使われるパターンを押さえておきましょう。
文字数制限のバリデーション
# 文字数制限のバリデーション
def validate_length(text, min_len, max_len):
length = len(text)
if length < min_len: return f"NG:{length}文字(最低{min_len}文字必要)" elif length > max_len:
return f"NG:{length}文字(最大{max_len}文字まで)"
else:
return f"OK:{length}文字"
print(validate_length("ネジ", 3, 20))
print(validate_length("キーボード", 3, 20))
print(validate_length("ドラゴンフルーツとアボカドとサーモンの豪華プレート", 3, 20))
# 出力結果:NG:2文字(最低3文字必要)
# 出力結果:OK:5文字
# 出力結果:NG:24文字(最大20文字まで)
入力フォームのバリデーションなど、最小・最大の文字数チェックは実際のアプリケーション開発で非常によく使われるパターンです。
文字列を指定文字数で切り出す
# 文字列を指定文字数で切り出す
def truncate(text, max_len, suffix="…"):
if len(text) <= max_len:
return text
return text[:max_len] + suffix
title1 = "アボカドの育て方ガイド"
title2 = "ドラゴンフルーツの栄養素と美容効果について詳しく解説"
print(truncate(title1, 12))
print(truncate(title2, 12))
# 出力結果:アボカドの育て方ガイド
# 出力結果:ドラゴンフルーツの栄…
ブログのタイトルやSNSの投稿文字数制限など、一定文字数を超えたら末尾を省略するという処理は実用的なユースケースです。
文字列の長さを比較・ソートに使う
# 文字列の長さでソート
items = ["ロバ", "ドラゴンフルーツ", "サーモン", "ネジ", "キーボード"]
# 文字数が少ない順にソート
sorted_items = sorted(items, key=len)
print(sorted_items)
# 文字数が多い順にソート
sorted_items_desc = sorted(items, key=len, reverse=True)
print(sorted_items_desc)
# 出力結果:['ロバ', 'ネジ', 'サーモン', 'キーボード', 'ドラゴンフルーツ']
# 出力結果:['ドラゴンフルーツ', 'キーボード', 'サーモン', 'ロバ', 'ネジ']
sorted()のkey引数にlenを渡すことで、文字数順のソートが簡単に実現できます。テキストデータの整理や表示順の調整に役立つパターンです。
len()に関するよくある疑問と注意点
続いては、len()を使う際によくある疑問や注意すべきポイントを確認していきます。
len()はシンプルな関数ですが、文字数とバイト数の違いや、Noneへの適用などいくつか気をつけたい点があります。
Noneや数値にlen()を使うとエラーになる
# Noneや数値にはlen()は使えない
value = None
# 安全にlen()を使う方法
if value is not None:
print(len(value))
else:
print("値がNoneです。")
# str()で変換してから使う
number = 12345
print(len(str(number)))
# 出力結果:値がNoneです。
# 出力結果:5
数値の桁数を取得したい場合は、str()で文字列に変換してからlen()を使う方法が定番です。
リストやタプルの長さも同じくlen()で取得できる
# len()は文字列以外にも使える
my_list = ["ボルト", "ネジ", "ワッシャー", "ナット"]
my_tuple = ("アボカド", "サーモン", "ゴリラ")
my_dict = {"color": "green", "weight": 200}
print(f"リストの要素数:{len(my_list)}")
print(f"タプルの要素数:{len(my_tuple)}")
print(f"辞書のキー数:{len(my_dict)}")
# 出力結果:リストの要素数:4
# 出力結果:タプルの要素数:3
# 出力結果:辞書のキー数:2
len()は文字列だけでなく、リスト・タプル・辞書・集合など「長さを持つオブジェクト」全般に使えます。Pythonの汎用的な組み込み関数として、様々な場面で活躍するでしょう。
文字列長を使ったパディング処理
# 文字列長を使ったパディング(幅揃え)
items = ["ネジ", "キーボード", "ドラゴンフルーツ", "パソコン"]
max_len = max(len(item) for item in items)
for item in items:
padding = " " * (max_len - len(item))
print(f"{item}{padding} : 在庫あり")
# 出力結果:ネジ : 在庫あり
# 出力結果:キーボード : 在庫あり
# 出力結果:ドラゴンフルーツ : 在庫あり
# 出力結果:パソコン : 在庫あり
最大文字数との差分を計算してスペースを補うことで、テキストベースの整形表示が実現できます。
まとめ
この記事では、Pythonで文字列の長さを取得するlen()関数の使い方について、基本から応用まで幅広く解説しました。
len()は文字列を渡すだけで文字数を返すシンプルな関数ですが、バイト数の取得にはencode()との組み合わせが必要です。日本語はUTF-8で1文字3バイトになる点を覚えておくと、バイト数制限が絡む処理でも正確に対応できます。
バリデーション・文字列の切り出し・ソートの基準など、len()の活用場面は非常に幅広いものです。今回紹介したパターンをベースに、実際のコードでどんどん応用してみてください。