Python offre plusieurs manières de convertir des chaînes de caractères représentant des nombres en leurs équivalents numériques (flottants ou entiers). La méthode optimale dépend de facteurs tels que le format de chaîne attendu, la gestion des erreurs et les considérations de performance. Cet article explore ces techniques et leurs compromis.
Table des matières
- Utiliser
float()
pour la conversion chaîne-vers-flottant - Utiliser
int()
pour la conversion chaîne-vers-entier - Conversion sécurisée avec
ast.literal_eval()
- Gestion de la localisation et des virgules
- Comparaison des performances des méthodes de conversion
1. Utiliser float()
pour la conversion chaîne-vers-flottant
L’approche la plus simple est d’utiliser la fonction intégrée float()
. Elle tente d’analyser la chaîne en son équivalent à virgule flottante. Si la chaîne n’est pas une représentation flottante valide (par exemple, contient des caractères non numériques), une ValueError
est levée.
string_number = "3.14159"
float_number = float(string_number)
print(float_number) # Sortie : 3.14159
string_number = "10"
float_number = float(string_number)
print(float_number) # Sortie : 10.0
try:
invalid_number = float("abc")
except ValueError:
print("Chaîne invalide pour la conversion en flottant") # Sortie : Chaîne invalide pour la conversion en flottant
2. Utiliser int()
pour la conversion chaîne-vers-entier
De même, int()
convertit les chaînes en entiers. Elle lève également une ValueError
si la chaîne ne représente pas un nombre entier ; les parties fractionnaires provoqueront une erreur.
string_number = "10"
int_number = int(string_number)
print(int_number) # Sortie : 10
try:
invalid_number = int("3.14")
except ValueError:
print("Chaîne invalide pour la conversion en entier") # Sortie : Chaîne invalide pour la conversion en entier
try:
invalid_number = int("abc")
except ValueError:
print("Chaîne invalide pour la conversion en entier") # Sortie : Chaîne invalide pour la conversion en entier
3. Conversion sécurisée avec ast.literal_eval()
La fonction ast.literal_eval()
du module ast
offre une alternative plus sûre, surtout lorsqu’on traite des entrées non fiables. Elle analyse la chaîne en utilisant l’arbre de syntaxe abstraite (AST) de Python, empêchant l’exécution de code malveillant incorporé dans la chaîne. Ceci est vital pour la sécurité lors de la manipulation de données externes.
import ast
string_number = "3.14159"
float_number = ast.literal_eval(string_number)
print(float_number) # Sortie : 3.14159
string_number = "10"
int_number = ast.literal_eval(string_number)
print(int_number) # Sortie : 10
try:
unsafe_input = ast.literal_eval("__import__('os').system('rm -rf /')") # Ceci lèvera une erreur
except (ValueError, SyntaxError):
print("ast.literal_eval a empêché l'exécution de code malveillant")
4. Gestion de la localisation et des virgules
Dans certaines localisations, les nombres utilisent des virgules comme séparateurs de milliers (par exemple, « 1 000,50 »). float()
ne gérera pas directement cela. Prétraitez la chaîne en remplaçant les virgules par des points (ou vice versa, selon votre localisation) avant la conversion. Le module locale
peut aider au formatage spécifique à la localisation.
import locale
locale.setlocale(locale.LC_NUMERIC, 'fr_FR.UTF-8') # Exemple pour la localisation française
string_number = "1,000.50"
processed_number = string_number.replace(",", "")
float_number = float(processed_number)
print(float_number) # Sortie : 1000.5
#Pour les localisations utilisant '.' comme séparateur de milliers et ',' comme séparateur décimal
string_number = "1.000,50"
processed_number = string_number.replace(".", "").replace(",", ".")
float_number = float(processed_number)
print(float_number) #Sortie: 1000.5
5. Comparaison des performances des méthodes de conversion
float()
et int()
sont généralement les plus rapides. ast.literal_eval()
est plus lent en raison de la surcharge d’analyse de l’AST. Cependant, ses avantages en termes de sécurité surpassent souvent la différence de performance, surtout avec des entrées non fiables. Pour les grands ensembles de données où les performances sont cruciales et les données sont fiables, float()
et int()
sont préférables. Pour les ensembles de données plus petits ou lorsque la sécurité est primordiale, ast.literal_eval()
est un choix plus sûr. L’analyse comparative avec timeit
peut fournir des comparaisons quantitatives.