Validadores com Python e buscar endereço por CEP
- Amanda Nascimento
- 20 de mar.
- 6 min de leitura
Validador de CPF com python
No script abaixo contem a verificação de cpf para ver se o número informado faz sentido, se contem 11 dígitos, caso o usuário tenha digitado letras ou algum outro caracter no meio dos números, é tratado para ficar apenas números e se o cpf for válido, informa o estado de origem.
# Validador de CPF
# V:01.1
def verifica_qnt_digitos(cpf):
cpf_txt = str(cpf)
qnt_caracter = len(cpf_txt)
if qnt_caracter > 11:
return cpf_txt, "Erro encontrado: CPF digitado contém mais de 11 dígitos.", False
elif qnt_caracter == 11:
return cpf_txt, None, True
else:
cpf_corrigido = cpf_txt.zfill(11)
return cpf_corrigido, f"Correção realizada: Adicionados {11 - qnt_caracter} dígitos para completar 11 caracteres.", True
def limpar_cpf(cpf):
numeros_validos = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
cpf_limpo = ""
ajustes_realizados = False
for caractere in str(cpf):
if caractere in numeros_validos:
cpf_limpo += caractere
else:
ajustes_realizados = True
if ajustes_realizados:
return cpf_limpo, "Remoção de caracteres inválidos"
else:
return cpf_limpo, None
def verifica_estado(cpf):
terceiro_digito = cpf[-3]
if terceiro_digito == "1":
return f" O CPF é de origem dos estados: Distrito Federal, Goiás, Mato Grosso do Sul ou Tocantins"
if terceiro_digito == "2":
return f" O CPF é de origem dos estados: Pará, Amazonas, Acre, Amapá, Rondônia ou Roraima"
if terceiro_digito == "3":
return f" O CPF é de origem dos estados: Ceará, Maranhão ou Piauí"
if terceiro_digito == "4":
return f" O CPF é de origem dos estados: Pernambuco, Rio Grande do Norte, Paraíba ou Alagoas"
if terceiro_digito == "5":
return f" O CPF é de origem dos estados: Bahia ou Sergipe"
if terceiro_digito == "6":
return f" O CPF é de origem do estado de Minas Gerais"
if terceiro_digito == "7":
return f" O CPF é de origem dos estados: Rio de Janeiro ou Espírito Santo"
if terceiro_digito == "8":
return f" O CPF é de origem do estado de São Paulo"
if terceiro_digito == "9":
return f" O CPF é de origem dos estados: Paraná ou Santa Catarina"
if terceiro_digito == "0":
return f" O CPF é de origem do estado do Rio Grande do Sul"
def validador(cpf):
# digito 10
num1 = int(cpf[0]) * 10
num2 = int(cpf[1]) * 9
num3 = int(cpf[2]) * 8
num4 = int(cpf[3]) * 7
num5 = int(cpf[4]) * 6
num6 = int(cpf[5]) * 5
num7 = int(cpf[6]) * 4
num8 = int(cpf[7]) * 3
num9 = int(cpf[8]) * 2
soma_dig10 = num1 + num2 + num3 + num4 + num5 + num6 + num7 + num8 + num9
resto_divisao_dig10 = soma_dig10 % 11
if resto_divisao_dig10 < 2:
digito10= 0
else:
digito10 = 11 - resto_divisao_dig10
# digito 11
num1_1 = int(cpf[0]) * 11
num2_2 = int(cpf[1]) * 10
num3_3 = int(cpf[2]) * 9
num4_4 = int(cpf[3]) * 8
num5_5 = int(cpf[4]) * 7
num6_6 = int(cpf[5]) * 6
num7_7 = int(cpf[6]) * 5
num8_8 = int(cpf[7]) * 4
num9_9 = int(cpf[8]) * 3
num10 = digito10 * 2
soma_dig11 = num1_1 + num2_2 + num3_3 + num4_4 + num5_5 + num6_6 + num7_7 + num8_8 + num9_9 + num10
resto_divisao_dig11 = soma_dig11 % 11
if resto_divisao_dig11 < 2:
digito11= 0
else:
digito11 = 11 - resto_divisao_dig11
ultimosdigitosinfomado = cpf[-2:]
ultimosdigitoscalculados = str(digito10) + str(digito11)
if ultimosdigitosinfomado == ultimosdigitoscalculados:
return "CPF Ok", None
else:
return "CPF inválido", f"Erro encontrado: Últimos dígitos calculados não coincidem. Esperado: {ultimosdigitoscalculados}, Informado: {ultimosdigitosinfomado}"
def main():
cpf = input("Digite seu CPF: ")
cpf_limpado, ajuste_limpado = limpar_cpf(cpf)
# Verifica e corrige o CPF se necessário
cpf_corrigido, correcao_msg, valido_para_verificacao = verifica_qnt_digitos(cpf_limpado)
# Se o CPF não for válido para verificação, já retorna o erro
if not valido_para_verificacao:
print("Resultado da validação: CPF inválido")
print(correcao_msg)
return
# Valida o CPF
resultado, erro_msg = validador(cpf_corrigido)
print(f"Resultado da validação: {resultado}")
if resultado == "CPF Ok":
if correcao_msg:
print(f"Correções feitas: {correcao_msg}")
estado = verifica_estado(cpf_corrigido)
print(estado) # Estado só é exibido se o CPF for válido
else:
if erro_msg:
print(erro_msg)
if ajuste_limpado:
print(f"Ajustes feitos: {ajuste_limpado}")
if __name__ == "__main__":
main()
Validador de Data com python
Considerando a data do formato de dia, mês e ano podemos fazer algumas verificações como quantidade limite de dias dentro de um mês, pois alguns meses vão até 30 outros 31 ou mês de fevereiro em ano bisexto. O Scripot verifica também o mês se esta coerente, considerando meses de 1 a 12.
def limpa_data(data):
# Se o separador "/" estiver presente, processa os componentes separadamente.
if "/" in data:
partes = data.split("/")
if len(partes) != 3:
print("Formato de data inválido. Use dd/mm/aaaa.")
return None
dia_str, mes_str, ano_str = partes
# Se o dia ou mês tiverem apenas 1 dígito, adiciona o zero à esquerda.
if len(dia_str) == 1:
dia_str = "0" + dia_str
if len(mes_str) == 1:
mes_str = "0" + mes_str
if len(ano_str) != 4:
print("Erro: Ano deve ter 4 dígitos.")
return None
data_limpa = dia_str + mes_str + ano_str
else:
# Se não houver separador, remove manualmente os caracteres não numéricos.
numeros_validos = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
data_limpa = ""
for caractere in data:
if caractere in numeros_validos:
data_limpa += caractere
# Aqui esperamos 8 dígitos. Se for 7, não é possível identificar qual parte está sem o zero.
if len(data_limpa) == 7:
print("Formato numérico inválido. Use dd/mm/aaaa.")
return None
elif len(data_limpa) != 8:
print("Formato numérico inválido. Use dd/mm/aaaa.")
return None
# Agora data_limpa tem exatamente 8 dígitos: ddmmyyyy
dia = int(data_limpa[:2])
mes = int(data_limpa[2:4])
ano = int(data_limpa[4:])
# Valida o dia e o mês
if dia < 1 or dia > 31:
print("Erro: Dia inválido.")
return None
if mes < 1 or mes > 12:
print("Erro: Mês inválido.")
return None
# Valida o ano (por exemplo, entre 1900 e 2100)
if ano < 1900 or ano > 2100:
print("Erro: Ano inválido.")
return None
# Função interna para verificar se o ano é bissexto.
def ano_bissexto(ano):
return (ano % 4 == 0 and ano % 100 != 0) or (ano % 400 == 0)
# Verifica se o dia informado é válido conforme o mês e se é ano bissexto (para fevereiro)
if mes == 2:
if ano_bissexto(ano):
if dia > 29:
print("Erro: Fevereiro em ano bissexto só vai até 29.")
return None
else:
if dia > 28:
print("Erro: Fevereiro em ano comum só vai até 28.")
return None
elif mes in [4, 6, 9, 11]:
if dia > 30:
print("Erro: Esse mês só tem até 30 dias.")
return None
# Para os demais meses (com 31 dias) já foi validado se o dia está acima de 31.
# Informa se o ano é bissexto
if ano_bissexto(ano):
print("Esse ano é bissexto.")
else:
None
return f"Data válida: {dia:02d}/{mes:02d}/{ano}"
data_input = input("Digite sua data de nascimento no formato dd/mm/aaaa: ")
resultado = limpa_data(data_input)
if resultado:
print(resultado)
Validador de Nome e Sobrenome com python
No script abaixo é removido o espaço inicial e final se houver, também é removido caracteres especiais, letras iniciais maiúsculas e precisa ter um nome e sobrenome.
def valida_nome(nome):
# Remove espaços extras no início e no fim
nome = nome.strip()
# Verifica se há pelo menos um sobrenome
partes = nome.split()
if len(partes) < 2:
print("Erro: Digite pelo menos um sobrenome.")
return None
# Verifica se todas as partes do nome contêm apenas letras
if not all(parte.isalpha() for parte in partes):
print("Erro: O nome deve conter apenas letras.")
return None
# Padroniza as primeiras letras como maiúsculas
nome_formatado = " ".join(parte.capitalize() for parte in partes)
return f"Nome válido: {nome_formatado}"
nome_input = input("Digite seu nome completo: ")
resultado = valida_nome(nome_input)
if resultado:
print(resultado)
Validador de e-mail com python
import re
def valida_email(email):
# Expressão regular para validar e-mail
padrao_email = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
if re.match(padrao_email, email):
return f"E-mail válido: {email}"
else:
return "Erro: E-mail inválido."
email_input = input("Digite seu e-mail: ")
print(valida_email(email_input))
Validador de senha com python
def valida_senha(senha):
# Verifica se a senha tem o comprimento correto
if not (6 <= len(senha) <= 15):
return "Erro: A senha deve ter entre 6 e 10 caracteres."
# Verifica se tem pelo menos 1 letra maiúscula
tem_maiuscula = False
for caractere in senha:
if caractere.isupper():
tem_maiuscula = True
break
if not tem_maiuscula:
return "Erro: A senha deve conter pelo menos uma letra maiúscula."
# Verifica se tem pelo menos 1 letra minúscula
tem_minuscula = False
for caractere in senha:
if caractere.islower():
tem_minuscula = True
break
if not tem_minuscula:
return "Erro: A senha deve conter pelo menos uma letra minúscula."
# Verifica se tem pelo menos 1 número
tem_numero = False
for caractere in senha:
if caractere.isdigit():
tem_numero = True
break
if not tem_numero:
return "Erro: A senha deve conter pelo menos um número."
# Verifica se tem pelo menos 1 caractere especial permitido
caracteres_especiais = "@%$#()[]{}!?*/-+"
tem_caractere_especial = False
for caractere in senha:
if caractere in caracteres_especiais:
tem_caractere_especial = True
break
if not tem_caractere_especial:
return f"Erro: A senha deve conter pelo menos um dos caracteres especiais: {caracteres_especiais}"
return "Senha válida!"
senha_input = input("Digite sua senha: ")
print(valida_senha(senha_input))
Buscar endereço por CEP
import requests
def limpar_cep(cep):
# Remove qualquer caractere que não seja número
cep_limpo = "".join(caractere for caractere in cep if caractere.isdigit())
# Verifica se tem exatamente 8 dígitos
if len(cep_limpo) != 8:
return None
return cep_limpo
def buscar_endereco_por_cep(cep):
cep_validado = limpar_cep(cep)
if not cep_validado:
return "Erro: O CEP deve conter exatamente 8 dígitos numéricos."
url = f"https://viacep.com.br/ws/{cep_validado}/json/"
resposta = requests.get(url)
if resposta.status_code == 200:
dados_endereco = resposta.json()
if "erro" not in dados_endereco:
return dados_endereco
else:
return "Erro: CEP não encontrado."
else:
return "Erro: Falha na consulta."
# Exemplo de uso
cep_informado = input("Digite o CEP: ")
resultado_consulta = buscar_endereco_por_cep(cep_informado)
if isinstance(resultado_consulta, dict):
print("Logradouro:", resultado_consulta.get("logradouro", "Não disponível"))
print("Bairro:", resultado_consulta.get("bairro", "Não disponível"))
print("Cidade:", resultado_consulta.get("localidade", "Não disponível"))
print("Estado:", resultado_consulta.get("uf", "Não disponível"))
else:
print(resultado_consulta)