Python / len() / Obtenir la longueur d’une chaîne

En Python, len(text) renvoie le nombre de points de code Unicode d’une chaîne, espaces et retours à la ligne compris. Ce nombre ne correspond pas toujours aux octets ni aux caractères perçus à l’écran. Pour les collections qui ont une longueur, comme les listes, tuples et dictionnaires, la fonction compte les éléments.

Utilisation, espaces et retours à la ligne

len() reçoit un objet qui prend en charge la longueur. Une chaîne vide vaut zéro ; les guillemets qui l’entourent ne comptent pas. Les points de code identifient les éléments textuels et constituent les unités du type str de Python.

Utilisez Python 3. Enregistrez chaque exemple complet en UTF-8 dans length_example.py et lancez python length_example.py, ou python3 selon l’installation. Remplacez le contenu pour exécuter les exemples indépendamment.

for text in ("abc", "", "a b", "a\nb"):
    print(repr(text), len(text))

Résultat attendu :

'abc' 3
'' 0
'a b' 3
'a\nb' 3

"a b" contient une espace et "a\nb" un retour à la ligne ; leur longueur est trois. La notation source \n utilise deux caractères, mais représente un seul retour à la ligne dans la valeur. repr() rend cette distinction visible.

Longueur de chaîne et octets UTF-8

L’encodage UTF-8 produit des bytes pour le stockage ou la transmission. len(text) compte les points de code ; len(text.encode("utf-8")) compte les octets encodés. Ici, \u00e9 représente é.

text = "caf\u00e9"
data = text.encode("utf-8")
print(len(text))
print(len(data))
4
5

Le texte contient quatre points de code mais cinq octets UTF-8, car le dernier caractère occupe deux octets. Pour une limite en octets d’un fichier ou protocole, utilisez l’encodage réellement requis. La longueur d’une chaîne ne mesure pas directement son occupation mémoire.

Caractères combinés et emoji

é peut être représenté par un point de code ou par e suivi d’un accent combinant, soit deux points de code. Un aspect similaire ne garantit ni égalité des valeurs ni même longueur. Les groupes de graphèmes Unicode regroupent des points de code en unités proches des caractères perçus.

import unicodedata

composed = "\u00e9"
decomposed = "e\u0301"
emoji = "\U0001f469\u200d\U0001f4bb"
print(len(composed), len(decomposed))
print(composed == decomposed)
print(len(unicodedata.normalize("NFC", decomposed)))
print(len(emoji))
1 2
False
1
3

La normalisation Unicode par unicodedata.normalize("NFC", text) compose les représentations canoniquement combinables. Ici, une longueur de deux devient un. Elle ne transforme pas tout emoji ou toute combinaison en un point de code : la séquence de la technicienne dans l’exemple en contient trois.

Avant une « limite de caractères », choisissez points de code, graphèmes ou octets. NFC ne remplace pas le comptage des graphèmes ; utilisez une implémentation des règles de segmentation Unicode adaptées et vérifiez des entrées représentatives.

Collections et valeurs non prises en charge

Les listes, tuples, dictionnaires et ensembles ont aussi une longueur. Les dictionnaires comptent les clés et les ensembles les éléments distincts. Une liste imbriquée compte ses éléments extérieurs, sans totaliser automatiquement son contenu interne.

print(len([10, 20, 30]))
print(len((10, 20)))
print(len({"a": 10, "b": 20}))
print(len({1, 1, 2}))
rows = [[1, 2], [3, 4]]
print(len(rows))
print(sum(len(row) for row in rows))
3
2
2
2
2
4

Les nombres et None n’ont pas de longueur et provoquent TypeError. Convertissez un nombre en chaîne pour mesurer sa représentation, signe négatif et point décimal compris. Être itérable ne garantit pas len() : les générateurs ordinaires n’ont pas de longueur.

for value in (1234, None):
    try:
        print(len(value))
    except TypeError:
        print("TypeError")
print(len(str(1234)))

items = (n * 2 for n in range(3))
try:
    print(len(items))
except TypeError:
    print("TypeError")
values = list(items)
print(len(values))
print(list(items))
TypeError
TypeError
4
TypeError
3
[]

Transformer un générateur en liste permet le comptage, mais consomme ses éléments et les conserve en mémoire. Le deuxième list(items) est donc vide. Ne matérialisez pas des données énormes ou un itérateur infini uniquement pour obtenir une longueur.

Un contrôle complet de longueur de saisie

Cette fonction accepte les chaînes et vérifie, après retrait des espaces périphériques, une longueur de 1 à 12 points de code. Les entrées vides ou constituées seulement d’espaces sont rejetées ; la chaîne initiale n’est pas modifiée.

def valid_name(text):
    if not isinstance(text, str):
        raise TypeError("name must be a string")
    name = text.strip()
    return 1 <= len(name) <= 12

for text in ("Ada", "   ", "a" * 13, "  Ada  "):
    print(repr(text), valid_name(text))
'Ada' True
'   ' False
'aaaaaaaaaaaaa' False
'  Ada  ' True

Elle ne valide pas le contenu ni les catégories de caractères, ne retire pas tous les espaces internes et ne limite pas les caractères visuels. Alignez unité de longueur, politique des espaces, caractères autorisés et validation serveur pour que l’interface et le stockage jugent la même entrée de façon cohérente.