Pythonで文字列の長さ(文字数)を数えるときは、組み込み関数len()を使うのが基本です。
英数字や日本語、スペースや改行、絵文字の扱いなど、初心者がつまずきやすい点もあります。
本記事では、len()の仕様と正しい使い方をサンプルコード付きで丁寧に解説し、よくある疑問にも先回りして答えます。
Pythonのlen()で文字数をカウントする基本
len(文字列)の書き方と返り値
文字列の長さはlen(s)
で整数(int)として返ります。
Python 3ではUnicodeの文字を自然に扱えるため、日本語も英数字も同様に数えられます。
# 基本の使い方
s1 = "Python"
s2 = "パイソン"
print(len(s1)) # 英字
print(len(s2)) # 日本語
6
4
例: 日本語・英数字の文字列
英数字、日本語、混在した文字列でも同様に数えられます。
# いくつかの例
print(len("こんにちは")) # 日本語
print(len("abc123")) # 英数字
print(len("ABC あいう 123")) # 混在(スペースも数えます)
5
6
11
空文字列の長さは0
中身のない空文字列""
は長さ0です。
空チェックの基礎として覚えておきます。
empty = ""
print(len(empty))
print(empty == "") # 空文字列かどうかの比較
print(bool(empty)) # Pythonの真偽値に変換(空はFalse)
0
True
False
len()の仕様とカウントのルール
スペース・改行・タブも文字数に含まれる
空白も文字です。
スペース" "
、タブ"\t"
、改行"\n"
はそれぞれ1文字として数えられます。
見た目では気づきにくいので、データ検証時は注意します。
# repr()で制御文字を可視化して確認
pairs = ["a b", "a\tb", "a\nb"]
for p in pairs:
print(repr(p), "=>", len(p))
'a b' => 3
'a\tb' => 3
'a\nb' => 3
全角/半角はどちらも1文字として数える
全角も半角も「文字数」としては等しく1です。
見た目の幅は関係しません。
samples = ["A", "A", "ア", "あ"]
for s in samples:
print(s, len(s))
A 1
A 1
ア 1
あ 1
絵文字や合成文字は見た目と一致しないことがある
絵文字や結合文字は、画面上は1つに見えても複数のコードポイントの組み合わせで表現されることがあります。
するとlen()
の値は見た目の“字形数”(人間が数える見た目の文字数)と一致しない場合があります。
# 絵文字や合成文字の長さ
print("👍", len("👍")) # サムズアップ
print("👍🏽", len("👍🏽")) # 肌色修飾付き(合成)
print("🇯🇵", len("🇯🇵")) # 国旗(地域指標2つの合成)
print("e\u0301", len("e\u0301")) # e + 合成用アクセント
print("é", len("é")) # 事前合成済みのé
print("👨👩👧", len("👨👩👧")) # 家族絵文字(ZWJ合成)
👍 1
👍🏽 2
🇯🇵 2
é 2
é 1
👨👩👧 5

入力制限(例えば「10文字以内」)を「見た目上の文字数」で行いたい場合、len()
では足りません。
見た目の“書記素クラスタ”(grapheme cluster)単位で数えるライブラリ(例: regexの\X
、graphemeパッケージなど)が必要です。
- 関連記事:正規表現(re)入門
Python3のlenはUnicodeコードポイントを数える
Python 3のlen()はUnicodeのコードポイント数を返します。
つまり、バイト数でも見た目の字形数でもありません。
下表のように、同じ「1字に見える」ものでもコードポイントの構成により結果が変わります。
表記 | 説明 | lenの結果 |
---|---|---|
A | ラテン文字 | 1 |
あ | ひらがな | 1 |
👍 | 絵文字(単独) | 1 |
👍🏽 | 絵文字+肌色修飾 | 2 |
🇯🇵 | 地域指標の合成(国旗) | 2 |
é | e + 結合アクセント | 2 |
é | 合成済み文字 | 1 |
よく使うlen()のパターン
最大文字数のバリデーション(len(s) <= N)
ユーザー名やタイトルなどで最大N文字までとしたい場面はよくあります。
len(s) <= N
で検証します。
def validate_length(s: str, max_len: int) -> bool:
"""文字列sがmax_len文字以下ならTrueを返す簡単なバリデーション"""
return len(s) <= max_len
name = "山田太郎"
max_len = 8
if validate_length(name, max_len):
print("OK:", name)
else:
print(f"NG: {name} は{max_len}文字を超えています")
OK: 山田太郎
絵文字を多用するUIで「見た目の文字数」で制限したい場合は、前述の通りlen()
ではなく書記素クラスタ単位で数える実装を検討してください。
非空チェックと空文字チェック
空でないことを調べるにはPythonの真偽値として評価するのが簡潔です。
等価ですが可読性は前者が高いです。
s1 = "data"
s2 = ""
# 推奨: 真偽値として評価
print("s1 is non-empty?", bool(s1))
print("s2 is non-empty?", bool(s2))
# 明示的にlenで
print("s1 length is 0?", len(s1) == 0)
print("s2 length is 0?", len(s2) == 0)
s1 is non-empty? True
s2 is non-empty? False
s1 length is 0? False
s2 length is 0? True
フォーム入力などで「未入力(空文字)かどうか」を判定する際は、不要な空白をstrip()
で取り除いてからチェックするのが実務的です。
最長/最短の文字列を見つける(key=len)
組み込みのmax
やmin
にkey=len
を渡すと、長さに基づく最大値/最小値を簡単に取得できます。
words = ["apple", "バナナ", "strawberry", "梨", "🍎🍏", "grape"]
longest = max(words, key=len)
shortest = min(words, key=len)
print("最長:", longest, len(longest))
print("最短:", shortest, len(shortest))
最長: strawberry 10
最短: 梨 1
複数行テキストの各行の長さを調べる
テキストエリアやログなど、複数行の文字列から各行の長さを得たいときはsplitlines()
が便利です。
末尾の改行も数えたい場合はkeepends=True
を使います。
text = "1行目\n2行目\n3行目"
lines = text.splitlines() # 改行は除去される
lines_keep = text.splitlines(True) # 改行を保持する
print("改行なしで行長を数える")
for i, line in enumerate(lines, 1):
print(i, repr(line), len(line))
print("\n改行込みで行長を数える")
for i, line in enumerate(lines_keep, 1):
print(i, repr(line), len(line))
改行なしで行長を数える
1 '1行目' 3
2 '2行目' 3
3 '3行目' 3
改行込みで行長を数える
1 '1行目\n' 4
2 '2行目\n' 4
3 '3行目' 3
よくある疑問とハマりどころ
文字数とバイト数の違い(len(s)とlen(s.encode(“utf-8”)))
len()は文字数、バイト数はエンコード後に数えるという違いがあります。
UTF-8では日本語1文字が3バイトになるのが一般的です。
s = "あA"
print("len(s):", len(s)) # 文字数
print("len(s.encode('utf-8')):", len(s.encode("utf-8"))) # UTF-8のバイト数
print("len(s.encode('utf-16-le')):", len(s.encode("utf-16-le"))) # UTF-16LEのバイト数
len(s): 2
len(s.encode('utf-8')): 4
len(s.encode('utf-16-le')): 4
文字コードによってバイト数は変わります。
例えばshift_jis
では日本語は2バイトですが、すべての文字(絵文字など)を表現できるわけではありません。
数値にはlen()は使えない(文字列に変換して数える)
len()
は「コレクションや文字列の長さ」を測る関数なので、整数など数値型にそのまま使うとエラーになります。
数値の桁数を数えたいときは文字列に変換します。
n = 12345
try:
print(len(n)) # TypeError
except TypeError as e:
print("TypeError:", e)
print(len(str(n))) # "12345" の長さ
print(len(str(-123))) # 先頭のマイナスも1文字として数えられる
TypeError: object of type 'int' has no len()
5
4
符号を除いた桁数が欲しい場合はlen(str(abs(n)))
のようにします。
入力の末尾改行で文字数が1増えるケース
標準入力で行単位に読み取ると末尾に改行が含まれるため、そのままlen()
を取ると+1されます。
不要ならrstrip()
で削るのが定石です。
import sys
# 仮に標準入力から1行読み取るケース(末尾に\nが含まれる)
line = sys.stdin.readline() # 例: 入力が「hello↵」なら "hello\n"
print("raw:", repr(line), len(line))
# 改行を取り除いてから数える
line_stripped = line.rstrip("\r\n")
print("stripped:", repr(line_stripped), len(line_stripped))
※helloと入力した場合
raw: 'hello\n' 6
stripped: 'hello' 5
input()は末尾の改行を含まない点も覚えておくと混乱を避けられます。
まとめ
Pythonで文字数をカウントする基本はlen()で、Python 3ではUnicodeのコードポイント数が返る点が最重要です。
スペースや改行も1文字に数えられ、全角/半角の見た目の幅は影響しません。
一方、絵文字や合成文字は見た目の文字数と一致しない場合があるため、UIの入力制限などで“見た目どおり”のカウントが必要なら書記素クラスタ単位の手法を採用してください。
実務では、len(s) <= N
によるバリデーション、空文字チェック、key=len
での最長・最短取得、行ごとの長さ計測が頻出です。
加えて、文字数とバイト数は異なること、数値にlenは使えないこと、改行の有無で長さが変わることを押さえておけば、初心者がつまずきやすい罠を避けられます。