Python
Tipos de datos básicos
string
convertir

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.

copyright for FConversión de cadenas en Python: número, entero, real, binario, hexadecimal, fecha y hora, bytes, listas

© 2023 All rights reserved.