top of page

Validadores com Python e buscar endereço por CEP

  • Foto do escritor: Amanda Nascimento
    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)


© 2017-2025  Criado e desenvolvido por Amanda Nascimento

  • Discord
  • GitHub
  • youtube
  • LinkedIn Amanda
bottom of page