Comprobar NIF con Python

Este es una pequeña función que nos permitirá comprobar si un NIF introducido es correcto. Se sabe que para comprobar el nif hay que realizar una división entre el numero DNI y 23 y comparar el resto con una tabla formada por letras.

Si habeis programado antes en web seguro que lo habréis visto tanto en Javascript como en PHP. Este pequeño ejemplo está realizado en Python:

def nif():
	import string # no necesario
	tabla = "TRWAGMYFPDXBNJZSQVHLCKE"
	numeros = "1234567890"
	nif = raw_input("Introduzca el NIF: ")
	respuesta = "No ha introducido un NIF valido"
	if (len(nif) == 9):
		letraControl = nif[8].upper()
		dni = nif[:8]
		if ( len(dni) == len( [n for n in dni if n in numeros] ) ):
			if tabla[int(dni)%23] == letraControl:
				respuesta="El NIF introducido es correcto"
	print respuesta

Desgranemos un poco el asunto
Primero declaramos la función e importamos la clase string (No es necesario)

def nif():
	import string #no necesario

Luego añadimos la tabla de letras y una con todos los numeros para poder comparar los datos introducidos (sin incluir la I, tal y comenta Manuel en el primer comentario):

##tabla="TRWAGMYFPDXBIJZSQVHLCKE"
tabla="TRWAGMYFPDXBNJZSQVHLCKE"
números="1234567890"

Pediremos que introduzcan el nif y declararemos la respuesta negativa, por defecto:

nif = raw_input("Introduzca el NIF: ")
respuesta = "No ha introducido un NIF valido"

Ahora viene el meollo:
Comprobaremos que el NIF introducido tiene 9 caracteres.

if (len(nif) == 9):

Acto seguido, separaremos la letra (pasándola a mayúscula) en la variable letraControl y los dígitos los guardaremos en la variable dni. Ambas serán del tipo String, ya que provienen de otro String

letraControl = nif[8].upper()
dni = nif[:8]

En esta parte comprobaremos que cada dígito del String dni  es igual a algún otro dígito del String llamado números (que habíamos declarado al inicio).
Puede resultar un poco liosa pero con este método consigues incluir en una sola linea dos If y un For. Trabaja de la siguiente manera: Compara si la longitud del string dni es igual al numero de n’s en dni que están dentro del string números, donde cada n es un dígito del string dni.

if ( len(dni) == len( [n for n in dni if n in numeros] ) ):

Por ultimo comprobaremos si la letra que hemos separado coincide con la de la formula antes mencionada, y si es así, cambiaremos la respuesta negativa por una positiva.

if tabla[int(dni)%23] == letraControl:
	respuesta="El NIF introducido es correcto"

Ahora tan solo queda mostrar la respuesta por pantalla

print respuesta

Evidentemente, si en algún momentos no se cumple cualquiera de los tres condicionales, es que el Nif introducido no sera correcto.

Volveré pronto con mas y mejor!

Anuncios
Esta entrada fue publicada en Programación, Python. Guarda el enlace permanente.

4 respuestas a Comprobar NIF con Python

  1. Manuel dijo:

    La cadena de verificación de NIF es incorrecta. La correcta es “TRWAGMYFPDXBNJZSQVHLCKE” (http://es.wikibooks.org/wiki/Algoritmo_para_obtener_la_letra_del_NIF). Te falla una de las letras que pones, concretamente la “i” (creo que no se usa para evitar confusiones con los números, al igual que la O y la U).

    Otro tema, me parece que “import string” también sobra, dado que entra dentro de la importación por defecto del sistema.

    Por lo demás, muchísimas gracias por el ejemplo. Me ha venido muy bien.

    • marinmenyo dijo:

      Pues parece que si sobra esa I, no recuerdo de donde saque la cadena de caracteres. En cuanto al import, sobra pues ni siquiera hago referencia a ningun componente de la libreria! Gracias, buena observacion!

  2. Manuel dijo:

    Pero no es solamente quitar una I. También tienes que poner una N. Reemplaza la cadena por esta “TRWAGMYFPDXBNJZSQVHLCKE”, que es la correcta.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s