Chaînes et texte Unicode
En Python, str représente du texte Unicode immuable et bytes des données binaires, qui peuvent être du texte encodé. Le passage entre texte et octets exige un encodage.
text = "café"
payload = text.encode("utf-8")
restored = payload.decode("utf-8")
Conservez le texte sous forme de str dans le programme et encodez ou décodez aux frontières des fichiers, du réseau ou des sous-processus.
Opérations de séquence
name = "Ada Lovelace"
first = name[:3]
last_character = name[-1]
contains_space = " " in name
Les indices et tranches opèrent sur les points de code Unicode, pas sur les graphèmes perçus. Certains caractères visibles comprennent plusieurs points de code.
Les transformations renvoient des chaînes sans modifier l'original ; elles ne garantissent pas une identité d'objet distincte :
normalized = raw.strip().casefold()
words = normalized.split()
line = ", ".join(words)
Des += répétés dans une grande boucle peuvent créer des chaînes intermédiaires inutiles ; recueillez les fragments et utilisez join lorsque le coût de construction compte.
Formatage
Utilisez les f-strings pour une interpolation locale lisible et les spécifications de format :
message = f"{user}: {total:,.2f} CAD"
Le formatage n'est pas un échappement. SQL, HTML, les commandes du shell, les expressions régulières et les URL exigent chacun des API propres à leur contexte ; ne comptez jamais sur une f-string pour assurer la sécurité.
Égalité Unicode
Des textes visuellement semblables peuvent utiliser des séquences de points de code différentes. Normalisez lorsque le domaine exige une comparaison canonique et utilisez casefold plutôt que lower pour une correspondance agressive sans casse. Le classement dépendant de la langue et le traitement des noms humains demandent des bibliothèques et règles propres au domaine.
Tranches, nettoyage et comparaison canonique
Pour les méthodes des chaînes,
les indices commencent à zéro ; les indices négatifs comptent depuis la fin.
text[start:stop:step] exclut stop. Les bornes de tranche sont ramenées aux
limites de la chaîne, mais un indice individuel hors limites lève IndexError.
Un pas nul lève ValueError.
assert "abc"[1:99] == "bc"
assert "abc"[::-1] == "cba"
assert "abc"[5:] == ""
assert " a b ".split() == ["a", "b"]
assert "a,,b".split(",") == ["a", "", "b"]
assert "abbaXba".strip("ab") == "X"
assert "report.txt".removesuffix(".txt") == "report"
strip(chars) retire répétitivement chacun de ces caractères aux deux extrémités,
pas un préfixe ou suffixe exact. En cas d'absence, find renvoie -1, tandis que
index lève ValueError. Utilisez in pour tester uniquement la présence.
join exige des chaînes et ne convertit pas implicitement les nombres.
Le guide Unicode distingue égalité des points de code et équivalence canonique :
import unicodedata
composed = "é"
decomposed = "e\u0301"
assert composed != decomposed
assert (len(composed), len(decomposed)) == (1, 2)
assert unicodedata.normalize("NFC", decomposed) == composed
assert "Straße".casefold() == "strasse"
assert len("café".encode("utf-8")) == 5
NFC ne fusionne pas tous les caractères visuellement semblables et n'ignore pas
la casse. Une normalisation de compatibilité comme NFKC peut effacer des distinctions
nécessaires au domaine. Décoder de l'UTF-8 invalide lève par défaut
UnicodeDecodeError ; ignorer les erreurs perd silencieusement des données.
Des données binaires ne représentent pas nécessairement du texte.