Python Programming

Conversão Eficiente de String para Número em Python

Spread the love

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

  1. Usando float() para Conversão de String para Float
  2. Usando int() para Conversão de String para Inteiro
  3. Conversão Segura com ast.literal_eval()
  4. Tratando Localização e Vírgulas
  5. 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *