Python oferece diversas maneiras de converter strings que representam números em seus equivalentes numéricos (floats ou inteiros). O método ideal depende de fatores como o formato de string de entrada esperado, as necessidades de tratamento de erros e considerações de desempenho. Este artigo explora essas técnicas e seus trade-offs.
Sumário
- Usando
float()
para Conversão de String para Float - Usando
int()
para Conversão de String para Inteiro - Conversão Segura com
ast.literal_eval()
- Tratando Localização e Vírgulas
- Comparação de Desempenho dos Métodos de Conversão
1. Usando float()
para Conversão de String para Float
A abordagem mais simples é usar a função float()
embutida. Ela tenta analisar a string em seu equivalente de ponto flutuante. Se a string não for uma representação float válida (por exemplo, contém caracteres não numéricos), um ValueError
é levantado.
string_number = "3.14159"
float_number = float(string_number)
print(float_number) # Saída: 3.14159
string_number = "10"
float_number = float(string_number)
print(float_number) # Saída: 10.0
try:
invalid_number = float("abc")
except ValueError:
print("String inválida para conversão float") # Saída: String inválida para conversão float
2. Usando int()
para Conversão de String para Inteiro
Similarmente, int()
converte strings para inteiros. Também levanta um ValueError
se a string não representar um número inteiro; partes fracionárias causarão um erro.
string_number = "10"
int_number = int(string_number)
print(int_number) # Saída: 10
try:
invalid_number = int("3.14")
except ValueError:
print("String inválida para conversão inteira") # Saída: String inválida para conversão inteira
try:
invalid_number = int("abc")
except ValueError:
print("String inválida para conversão inteira") # Saída: String inválida para conversão inteira
3. Conversão Segura com ast.literal_eval()
A função ast.literal_eval()
do módulo ast
oferece uma alternativa mais segura, especialmente ao lidar com entrada não confiável. Ela analisa a string usando a Árvore de Sintaxe Abstrata (AST) do Python, prevenindo a execução de código malicioso embutido na string. Isso é vital para segurança ao lidar com dados externos.
import ast
string_number = "3.14159"
float_number = ast.literal_eval(string_number)
print(float_number) # Saída: 3.14159
string_number = "10"
int_number = ast.literal_eval(string_number)
print(int_number) # Saída: 10
try:
unsafe_input = ast.literal_eval("__import__('os').system('rm -rf /')") # Isso levantará um erro
except (ValueError, SyntaxError):
print("ast.literal_eval preveniu a execução de código malicioso")
4. Tratando Localização e Vírgulas
Em algumas localidades, os números usam vírgulas como separadores de milhares (por exemplo, “1,000.50”). float()
não tratará diretamente esses casos. Pré-processe a string substituindo vírgulas por pontos (ou vice-versa, dependendo da sua localidade) antes da conversão. O módulo locale
pode auxiliar na formatação específica da localidade.
import locale
locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8') # Exemplo para localidade EUA
string_number = "1,000.50"
processed_number = string_number.replace(",", "")
float_number = float(processed_number)
print(float_number) # Saída: 1000.5
#Para localidades usando '.' como separador de milhares e ',' como separador decimal
string_number = "1.000,50"
processed_number = string_number.replace(".", "").replace(",", ".")
float_number = float(processed_number)
print(float_number) #Saída: 1000.5
5. Comparação de Desempenho dos Métodos de Conversão
float()
e int()
são geralmente os mais rápidos. ast.literal_eval()
é mais lento devido à sobrecarga de análise da AST. No entanto, seus benefícios de segurança geralmente superam a diferença de desempenho, especialmente com entrada não confiável. Para grandes conjuntos de dados onde o desempenho é crucial e os dados são confiáveis, float()
e int()
são preferidos. Para conjuntos de dados menores ou quando a segurança é primordial, ast.literal_eval()
é uma escolha mais segura. Benchmarking com timeit
pode fornecer comparações quantitativas.