閉じる

Pythonで文字数をカウントはlen()を使う

Pythonで文字列の長さ(文字数)を数えるときは、組み込み関数len()を使うのが基本です。

英数字や日本語、スペースや改行、絵文字の扱いなど、初心者がつまずきやすい点もあります。

本記事では、len()の仕様と正しい使い方をサンプルコード付きで丁寧に解説し、よくある疑問にも先回りして答えます。

Pythonのlen()で文字数をカウントする基本

len(文字列)の書き方と返り値

文字列の長さはlen(s)で整数(int)として返ります。

Python 3ではUnicodeの文字を自然に扱えるため、日本語も英数字も同様に数えられます。

Python
# 基本の使い方
s1 = "Python"
s2 = "パイソン"

print(len(s1))  # 英字
print(len(s2))  # 日本語
実行結果
6
4

例: 日本語・英数字の文字列

英数字、日本語、混在した文字列でも同様に数えられます。

Python
# いくつかの例
print(len("こんにちは"))       # 日本語
print(len("abc123"))         # 英数字
print(len("ABC あいう 123"))  # 混在(スペースも数えます)
実行結果
5
6
11

空文字列の長さは0

中身のない空文字列""は長さ0です。

空チェックの基礎として覚えておきます。

Python
empty = ""
print(len(empty))
print(empty == "")   # 空文字列かどうかの比較
print(bool(empty))   # Pythonの真偽値に変換(空はFalse)
実行結果
0
True
False

len()の仕様とカウントのルール

スペース・改行・タブも文字数に含まれる

空白も文字です

スペース" "、タブ"\t"、改行"\n"はそれぞれ1文字として数えられます。

見た目では気づきにくいので、データ検証時は注意します。

Python
# 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です。

見た目の幅は関係しません。

Python
samples = ["A", "A", "ア", "あ"]
for s in samples:
    print(s, len(s))
実行結果
A 1
A 1
ア 1
あ 1

絵文字や合成文字は見た目と一致しないことがある

絵文字や結合文字は、画面上は1つに見えても複数のコードポイントの組み合わせで表現されることがあります。

するとlen()の値は見た目の“字形数”(人間が数える見た目の文字数)と一致しない場合があります。

Python
# 絵文字や合成文字の長さ
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パッケージなど)が必要です。

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で検証します。

Python
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の真偽値として評価するのが簡潔です。

等価ですが可読性は前者が高いです。

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)

組み込みのmaxminkey=lenを渡すと、長さに基づく最大値/最小値を簡単に取得できます。

Python
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を使います。

Python
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バイトになるのが一般的です。

Python
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()は「コレクションや文字列の長さ」を測る関数なので、整数など数値型にそのまま使うとエラーになります。

数値の桁数を数えたいときは文字列に変換します。

Python
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()で削るのが定石です。

Python
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は使えないこと、改行の有無で長さが変わることを押さえておけば、初心者がつまずきやすい罠を避けられます。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!