FConversión de cadenas en Python: número, entero, real, binario, hexadecimal, fecha y hora, bytes, listas
En este artículo, aprenderás cómo convertir cadenas de Python a otros tipos de datos.
Las cadenas de Python juegan un papel importante en el proceso de interacción con los clientes.
Los datos que recibes de la función input()
, XML, y datos JSON de APIs web están todos inicialmente formateados como cadenas.
El servidor backend debe interpretar o parsear la cadena, convertirla al tipo de datos deseado, y luego realizar las acciones necesarias.
>>> nombre = input("¿Cómo te llamas?: ")
¿Cómo te llamas? Juan
>>> type(name)
<class 'str'>
1. Convertir a números
Empecemos por cómo convertir una cadena de Python a un número en el formato deseado.
Todas las conversiones numéricas tienen el potencial de fallar. Cuando ocurre, se lanza una excepción, por lo que siempre debes incluir el manejo de excepciones. El código de ejemplo a continuación incluye el manejo de excepciones.
1.1. Enteros
Para convertir una cadena de Python en un entero, utilice el constructor int()
.
Los constructores son funciones especiales que se utilizan para crear objetos de ciertas clases de Python. Hablaremos de ellos en el artículo sobre las clases.
He aquí un ejemplo de conversión de enteros con éxito.
str_one_hundred = "100"
str_minus_five = "-5"
try:
one_hundred = int(str_one_hundred)
minus_five = int(str_minus_five)
except ValueError:
print(f"Couldn't cast {repr(str_one_hundred)} to a number")
print(f"Couldn't cast {repr(str_minus_five)} to a number")
else:
print(f"one_hundred: {one_hundred}")
print(f"minus_five: {minus_five}")
# Output:
# one_hundred: 100
# minus_five: -5
Ejemplos de conversiones de enteros fallidas
str_alphabet = "abc"
try:
alphabet = int(str_alphabet)
except ValueError:
print(f"Couldn't cast {repr(str_alphabet)} to a number")
else:
print(f"alphabet: {alphabet}")
# Output:
# Couldn't cast 'abc' to a number
1.2. Números reales
Para convertir una cadena de Python en un número real, utilice el constructor float()
.
Aquí hay un ejemplo de una conversión exitosa a un número real.
str_three_point_two_four = "3.24"
str_zero_point_one_two = "-0.12"
try:
three_point_two_four = float(str_three_point_two_four)
zero_point_one_two = float(str_zero_point_one_two)
except ValueError:
print(f"Couldn't cast {repr(str_three_point_two_four)} to a float")
print(f"Couldn't cast {repr(str_zero_point_one_two)} to a float")
else:
print(f"three_point_two_four: {three_point_two_four}")
print(f"zero_point_one_two: {zero_point_one_two}")
# Output:
# three_point_two_four: 3.24
# zero_point_one_two: -0.12
Ejemplos de conversiones de enteros fallidas
str_alphabet = "abc"
try:
alphabet = float(str_alphabet)
except ValueError:
print(f"Couldn't cast {repr(str_alphabet)} to a float")
else:
print(f"alphabet: {alphabet}")
# Output:
# Couldn't cast 'abc' to a float
1.3. Binario
Python no soporta su propio tipo de datos binario. Por lo tanto, las cadenas binarias deben ser convertidas a tipos enteros para poder manejarlas.
Para convertir a entero, utiliza el constructor int()
con el parámetro opcional base
.
binary_string = "101010"
binary_integer = int(binary_string, base=2)
print(binary_integer)
# Outputs: 42
Si desea obtener el número entero del resultado en formato binario, puede utilizar el método descrito en el post F-string.
También puede decidir si desea añadir el prefijo 0b
como especificador de formato.
print(f'{binary_integer:#b}', f'{binary_integer:b}')
('0b101010', '101010')
1.4. Hexadecimal
Python no soporta su propio tipo de datos hexadecimal. Por lo tanto, las cadenas hexadecimales deben ser convertidas a tipos enteros para poder manejarlas.
Para convertir a entero, utilice el constructor int()
con el parámetro opcional base
.
hexa_string = "14F0"
hexa_integer = int(hexa_string, base=16)
print(hexa_integer)
# Outputs: 5360
Si desea obtener el número entero del resultado en formato hexadecimal, puede utilizar el método descrito en el post F-string.
También puede decidir si desea añadir el prefijo 0x
como especificador de formato.
print(f'{hexa_integer:#x}', f'{hexa_integer:x}')
('0x14f0', '14f0')
2. Tipos contenedores
Los tipos contenedores incorporados en Python - listas, tuplas, conjuntos y diccionarios - también se pueden convertir a partir de cadenas. Sin embargo, si intentas convertirlos con un constructor, como harías con un número, obtendrás un resultado diferente al esperado, como se muestra a continuación.
friends = "[Mark, Elon]"
friends_tuple = "(Mark, Elon)"
print(list(friends))
print(tuple(friends_tuple))
# Output:
# ['[', 'M', 'a', 'r', 'k', ',', ' ', 'E', 'l', 'o', 'n', ']']
# ('(', 'M', 'a', 'r', 'k', ',', ' ', 'E', 'l', 'o', 'n', ')')
Por lo tanto, necesitamos otra forma de analizar estos tipos de contenedores.
La función literal_eval()
proporcionada por el módulo ast
en la biblioteca estándar de Python proporciona una forma conveniente de analizarlos y convertirlos.
Esta función sustituye a la función eval()
, que puede ser pirateada.
2.1. Listas
El código para convertir una cadena a formato de lista puede escribirse como sigue
import ast
list_string = "['item1', 'item2', 'item3']"
my_list = ast.literal_eval(list_string)
print(my_list)
print(type(my_list))
# Output:
# ['item1', 'item2', 'item3']
# <class 'list'>
2.2. Tuplas
El código para convertir una cadena a un formato de tupla puede escribirse así
import ast
tuple_string = "('item1', 'item2', 'item3')"
my_tuple = ast.literal_eval(tuple_string)
print(my_tuple)
print(type(my_tuple))
# Output:
# ('item1', 'item2', 'item3')
# <class 'tuple'>
2.3. Conjuntos
El código para convertir una cadena con formato de conjunto puede escribirse del siguiente modo
import ast
set_string = "{'item1', 'item2', 'item3'}"
my_set = ast.literal_eval(set_string)
print(my_set)
print(type(my_set))
# Output:
# {'item3', 'item2', 'item1'}
# <class 'set'>
2.4. Diccionarios
El código para convertir una cadena con formato de diccionario puede escribirse como sigue.
import ast
dict_string = "{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}"
my_dict = ast.literal_eval(dict_string)
print(my_dict)
print(type(my_dict))
# Output:
# {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# <class 'dict'>
3. Cadenas de bytes
Para convertir una cadena en formato byte al tipo de datos bytes
, utiliza el método str.encode()
.
byte_like_string = "b'Hello'"
actual_bytes = byte_like_string[2:-1].encode('utf-8')
print(actual_bytes) # Outputs: b'Hello'
print(type(actual_bytes)) # Outputs: <class 'bytes'>
Elimina el prefijo para representar bytes en Python y sólo convierte el contenido con el método encode()
.
Puedes comprobar el tipo de byte con la función type(){;py}
.
4. Fecha Hora
Para extraer y leer información de fecha y hora de una cadena Python, utiliza el método strptime()
del módulo datetime
.
Ver datetime - 3. Formatting and parsing dates and times para una explicación y código de ejemplo. para más información.
5. Conclusión
Hasta ahora, hemos visto cómo convertir cadenas de Python a varios tipos diferentes, incluyendo números, tipos contenedor, tipos byte, y fecha y hora. Los tipos de cadena son una forma para que los programas se comuniquen con los usuarios, por lo que es importante entenderlos y usarlos bien.
