08. Python: validar entradas (ejemplos)

Publicado por

Las validaciones en un programa permiten asegurar que los datos proporcionados por los usuarios sean correctos, estas previenen posibles errores que estos puedan cometer, ya sea desde teclado o desde un archivo. Por esa razón son muy importantes en la programación, para que los sistemas devuelvan resultados exitosos. Veamos los siguientes ejemplos:

Validación de entrada de usuario

Es importante siempre validar los datos que se van a leer desde teclado, sea cual sea su tipo. Para avisarle al usuario de su error se utilizan las excepciones y es indispensable volver a solicitarle la información, por lo que estas siempre van dentro de ciclos que concluyen su ejecución hasta que la entrada sea correcta.

En el siguiente script se está validando que el usuario introduzca un entero.

#!/usr/bin/python

def lee_entero():
   while True:
       entrada = raw_input("Escribe un numero entero: ")
       try:
           entrada = int(entrada)
           return entrada
       except ValueError:
           print "La entrada es incorrecta: escribe un numero entero"

Salida:

$ python lee_entero.py
Escribe un numero entero: hola
La entrada es incorrecta: escribe un numero entero
Escribe un numero entero:
La entrada es incorrecta: escribe un numero entero
Escribe un numero entero: 12.30
La entrada es incorrecta: escribe un numero entero
Escribe un numero entero: 1000

Validación de argumentos

En este script se está validando el número de argumentos que recibe y además si estos son válidos o no. En caso de que no se introduzcan los argumentos muestra una pequeña documentación de lo que espera recibir.

#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys
import os

def uso(mensaje, codigo = 1):
    print mensaje
    print "%s: directorio_origen directorio_destino" % sys.argv[0]
    sys.exit(codigo)

if len(sys.argv) != 3:
    uso("Se requieren 2 argumentos, usted introdujo %d" % (len(sys.argv) - 1))
elif not os.path.isdir(sys.argv[1]):
    uso("Directorio de origen no válido")
elif not os.path.isdir(sys.argv[2]):
    uso("Directorio destino no válido")

origen, destino = sys.argv[1:3]

print "El directorio origen es: ", origen
print "El directorio destino es: ", destino

Salida:

$ python uso.py
Se requieren 2 argumentos, usted introdujo 0
uso.py: directorio_origen directorio_destino
$ python uso.py Documentos Descargas
El directorio origen es: Documentos
El directorio destino es: Descargas
$ python uso.py Descargas
Se requieren 2 argumentos, usted introdujo 1
uso.py: directorio_origen directorio_destino
$ python uso.py Descargas Documentos/
El directorio origen es: Descargas
El directorio destino es: Documentos/
$ python uso.py Descargas Documentos etc
Se requieren 2 argumentos, usted introdujo 3
uso.py: directorio_origen directorio_destino

Validación de cadenas

Algunos de los métodos más utilizados para validar cadenas son:

isalnum() Devuelve True si la cadena es alfanumérica, de lo contrario False.

>>> cadena_alfanumerica = "El valor es 1000"
>>> cadena_alfanumerica.isalnum()
False
>>> cadena_alfanumerica = "awlpftawnju8mke4r5i9cfaw"
>>> cadena_alfanumerica.isalnum()
True

isalpha() Devuelve True si la cadena es alfabética, de lo contrario False.

>>> cadena_alfabetica = "Hola mundo 1000"
>>> cadena_alfabetica.isalpha()
False
>>> cadena_alfabetica = "Hola mundo"
>>> cadena_alfabetica.isalpha()
False
>>> cadena_alfabetica = "Hola"
>>> cadena_alfabetica.isalpha()
True

isdigit() Devuelve True si la cadena es numérica, de lo contrario False.

>> cadena_numerica = "12345"
>>> cadena_numerica.isdigit()
True
>>> cadena_numerica = "1 2 3 4 5"
>>> cadena_numerica.isdigit()
False
>>> cadena_numerica = "1.2"
>>> cadena_numerica.isdigit()
False

islower Devuelve True si la cadena contiene solamente minúsculas, de lo contrario False.

>>> cadena_minusculas = "Hola mundo"
>>> cadena_minusculas.islower()
False
>>> cadena_minusculas = "hola mundo"
>>> cadena_minusculas.islower()
True

isupper Develve True si la cadena contiene solamente mayúsculas, de lo contrario False.

>>> cadena_mayusculas = "Hola mundo"
>>> cadena_mayusculas.isupper()
False
>>> cadena_mayusculas = "HOLA MUNDO"
>>> cadena_mayusculas.isupper()
True

isspace Devuelve True si la cadena contiene solamente espacios en blanco, de lo contrario False.

>>> cadena_espacios = "hola mundo"
>>> cadena_espacios.isspace()
False
>>> cadena_espacios = " "
>>> cadena_espacios.isspace()
True
>>> cadena_espacios = " "
>>> cadena_espacios.isspace()
True

Como lo habrás notado validar datos es una tarea relativamente sencilla, pero muchas veces se deja de lado ya sea por falta de tiempo o por considerarlo trabajo de rutina, sin embargo, es importante realizarlo ya que es una buena práctica de la programación y te ahorrará muchos problemas cuando tus programas sean más complejos. Con esta nota hemos llegado al final de la temporada 3 de la serie Administración de sistemas GNU/Linux”, la siguiente temporada será de Scripting en Perl. ¡Hasta pronto!

20 comments

  1. Ante todo, ¡muchas gracias por el aporte de quienes hacen la página y publican en ella!. En respuesta al comentario sobre que no funcionaba el primer código para la validación (validación de número entero), dejo a continuación el código con unas pequeñas modificaciones que probé y, al menos en mi caso, funcionó. Quizás a alguien le sirva.

    raw_input fue reemplazado en python a partir de la versión 3.0, creo. El código que funcionaría en el primer caso, sería (es importante respetar las tabulaciones):

    def lee_entero():
    while True:
    entrada = input(«Escribe un numero entero: «)
    try:
    entrada = int(entrada)
    return entrada
    except ValueError:
    print («La entrada es incorrecta: escribe un numero entero»)

    numero = lee_entero()

    1. La pizzería italiana Migliori Amici ofrece pizzas vegetarianas y no vegetarianas a sus clientes. Los ingredientes para cada tipo de pizza aparecen a continuación.
      Ingredientes vegetarianos: Pimiento, yerbas y tofu.
      Ingredientes no vegetarianos: Peperoni, Jamón y Salmón.
      Codificar un programa que solicite al usuario si quiere una pizza vegetariana o no, y en función de su respuesta le muestre un menú con los ingredientes disponibles para que elija. Solo se puede elegir un ingrediente, además de la mozzarella y el tomate que están en todas las pizzas. Al final se debe mostrar por pantalla si la pizza elegida es vegetariana o no y todos los ingredientes que lleva.
      Puedes ayudarme con este

      1. Hay algun método que valide que una cadena no contenga numeros, pero sin contar los acentos, ya que el isalpha() devuelve false si se le pasa un string con acentos.

  2. Hola buenas, no entiendo el tema del alfanumerico, no se supone que deberia ser True en caso que contenga letras Y numeros? lo intenté y da true aunque solo haya letras (sin necesidad de que haya numeros)

    1. Hola Federico

      El método isalnum() devuelve True sí la cadena es alfanumerica, es decir si contiene letras o números, puede ser ambos tipos o solo uno de ellos.

      Ejemplos de cadenas que devuelven true: «Hola», «Hola123», «123»
      Ejemplos de cadenas que devuelven false: «Hola 123» (en este caso tiene un espacio), «Hola!» (en este caso tiene un caracter especial)

      Espero esos ejemplos resuelvan tu duda.
      ¡Saludos!

  3. ¿Hola Miriam, puede ser que esto lo hayas escrito en Python 2.x no? Pregunto porque creo que expresiones como raw_input() o el print sin los () ya no corren en python 3.x. De todos, modos salvo esto creo que se puede extrapolar la explicación. Cordiales saludos desde Chaco Argentina.

  4. Saludos
    Bueno si sabemos que en caso de validar entradas de entero que sería este caso
    Nun1 = None
    Nun2 = None

    While True:
    Try:
    Nun1 = int(input(«ingresé un
    número»)
    Break
    Except:
    print(«ingrese un número»)
    Y hací con el otro input

    Como pudiéramos hacer esto con cadenas o quizás que vallan vacío el input. Bueno si usar Len.
    Quiero repetir en while hasta que el input sea llenado

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *