Agenda de Contatos em Python – Salvando Dados em Arquivo

Criar uma agenda de contatos é um dos projetos mais clássicos para quem está aprendendo a programar. Ele permite praticar conceitos fundamentais como manipulação de arquivoslistasdicionáriosentrada de dados do usuário e até mesmo persistência de informações.

Neste artigo, vamos construir uma aplicação simples em Python para gerenciar contatos (nome, telefone e e-mail), permitindo adicionar, listar, buscar e remover contatos. O diferencial será a persistência em arquivo de texto ou JSON, garantindo que os dados não sejam perdidos quando o programa for encerrado.




🔹 Conceitos que vamos aprender

Antes de começar, vale listar os principais conceitos:


🔹 Estrutura da Agenda de Contatos

Nossa agenda terá os seguintes recursos:

  1. Adicionar contato (nome, telefone e e-mail).

  2. Listar contatos salvos.

  3. Buscar contato pelo nome.

  4. Remover contato pelo nome.

  5. Salvar contatos em arquivo (TXT ou JSON).

  6. Carregar contatos ao iniciar o programa.


🔹 Versão simples – Salvando em arquivo TXT

A primeira versão usará um arquivo de texto (contatos.txt).

Código exemplo:

# agenda_txt.py

def carregar_contatos():
    contatos = []
    try:
        with open("contatos.txt", "r", encoding="utf-8") as arquivo:
            for linha in arquivo:
                nome, telefone, email = linha.strip().split(";")
                contatos.append({"nome": nome, "telefone": telefone, "email": email})
    except FileNotFoundError:
        pass  # Se não existir o arquivo, começamos com lista vazia
    return contatos


def salvar_contatos(contatos):
    with open("contatos.txt", "w", encoding="utf-8") as arquivo:
        for contato in contatos:
            arquivo.write(f"{contato['nome']};{contato['telefone']};{contato['email']}\n")


def adicionar_contato(contatos):
    nome = input("Nome: ")
    telefone = input("Telefone: ")
    email = input("E-mail: ")
    contatos.append({"nome": nome, "telefone": telefone, "email": email})
    salvar_contatos(contatos)
    print("✅ Contato adicionado com sucesso!")


def listar_contatos(contatos):
    if not contatos:
        print("Agenda vazia.")
    else:
        for contato in contatos:
            print(f"📌 {contato['nome']} - {contato['telefone']} - {contato['email']}")


def buscar_contato(contatos):
    nome = input("Digite o nome para buscar: ")
    encontrados = [c for c in contatos if nome.lower() in c["nome"].lower()]
    if encontrados:
        for contato in encontrados:
            print(f"🔎 {contato['nome']} - {contato['telefone']} - {contato['email']}")
    else:
        print("Contato não encontrado.")


def remover_contato(contatos):
    nome = input("Digite o nome do contato a remover: ")
    contatos_filtrados = [c for c in contatos if c["nome"].lower() != nome.lower()]
    if len(contatos_filtrados) < len(contatos):
        salvar_contatos(contatos_filtrados)
        print("🗑️ Contato removido com sucesso!")
    else:
        print("Contato não encontrado.")
    return contatos_filtrados


def menu():
    contatos = carregar_contatos()
    while True:
        print("\n📒 Agenda de Contatos")
        print("1 - Adicionar contato")
        print("2 - Listar contatos")
        print("3 - Buscar contato")
        print("4 - Remover contato")
        print("5 - Sair")

        opcao = input("Escolha: ")

        if opcao == "1":
            adicionar_contato(contatos)
        elif opcao == "2":
            listar_contatos(contatos)
        elif opcao == "3":
            buscar_contato(contatos)
        elif opcao == "4":
            contatos = remover_contato(contatos)
        elif opcao == "5":
            break
        else:
            print("Opção inválida.")


if __name__ == "__main__":
    menu()

📌 Nesta versão, os contatos são armazenados em arquivo texto no formato:

Maria;11987654321;maria@email.com
João;21999887766;joao@email.com

🔹 Versão melhorada – Salvando em JSON

Salvar dados em JSON é mais seguro e prático, já que o formato mantém a estrutura dos dicionários.

Código exemplo:

# agenda_json.py
import json

def carregar_contatos():
    try:
        with open("contatos.json", "r", encoding="utf-8") as arquivo:
            return json.load(arquivo)
    except FileNotFoundError:
        return []
    except json.JSONDecodeError:
        return []


def salvar_contatos(contatos):
    with open("contatos.json", "w", encoding="utf-8") as arquivo:
        json.dump(contatos, arquivo, indent=4, ensure_ascii=False)


def adicionar_contato(contatos):
    nome = input("Nome: ")
    telefone = input("Telefone: ")
    email = input("E-mail: ")
    contatos.append({"nome": nome, "telefone": telefone, "email": email})
    salvar_contatos(contatos)
    print("✅ Contato adicionado com sucesso!")


def listar_contatos(contatos):
    if not contatos:
        print("Agenda vazia.")
    else:
        for contato in contatos:
            print(f"📌 {contato['nome']} - {contato['telefone']} - {contato['email']}")


def buscar_contato(contatos):
    nome = input("Digite o nome para buscar: ")
    encontrados = [c for c in contatos if nome.lower() in c["nome"].lower()]
    if encontrados:
        for contato in encontrados:
            print(f"🔎 {contato['nome']} - {contato['telefone']} - {contato['email']}")
    else:
        print("Contato não encontrado.")


def remover_contato(contatos):
    nome = input("Digite o nome do contato a remover: ")
    contatos_filtrados = [c for c in contatos if c["nome"].lower() != nome.lower()]
    if len(contatos_filtrados) < len(contatos):
        salvar_contatos(contatos_filtrados)
        print("🗑️ Contato removido com sucesso!")
    else:
        print("Contato não encontrado.")
    return contatos_filtrados


def menu():
    contatos = carregar_contatos()
    while True:
        print("\n📒 Agenda de Contatos (JSON)")
        print("1 - Adicionar contato")
        print("2 - Listar contatos")
        print("3 - Buscar contato")
        print("4 - Remover contato")
        print("5 - Sair")

        opcao = input("Escolha: ")

        if opcao == "1":
            adicionar_contato(contatos)
        elif opcao == "2":
            listar_contatos(contatos)
        elif opcao == "3":
            buscar_contato(contatos)
        elif opcao == "4":
            contatos = remover_contato(contatos)
        elif opcao == "5":
            break
        else:
            print("Opção inválida.")


if __name__ == "__main__":
    menu()

📌 O arquivo contatos.json terá o seguinte formato:

[
    {
        "nome": "Maria",
        "telefone": "11987654321",
        "email": "maria@email.com"
    },
    {
        "nome": "João",
        "telefone": "21999887766",
        "email": "joao@email.com"
    }
]

🔹 Comparando TXT e JSON

FormatoVantagemDesvantagem
TXTSimples, fácil de ler manualmenteDifícil de manipular, precisa de parsing manual
JSONEstruturado, compatível com APIs e bancos de dadosArquivo pode corromper se não for salvo corretamente

👉 Dica prática: sempre que possível use JSON, principalmente se quiser integrar a agenda com sistemas externos.


🔹 Melhorias possíveis

Este projeto pode ser expandido com várias funcionalidades:

  • Interface gráfica com Tkinter ou PyQt.

  • Integração com SQLite para banco de dados mais robusto.

  • Exportação de contatos para Excel ou CSV.

  • Geração de relatórios em PDF com os contatos cadastrados.

  • Implementar backup automático da agenda.


✅ Conclusão

Criar uma agenda de contatos em Python é um excelente exercício prático para aprender sobre manipulação de arquivos, dicionários, listas e persistência de dados.

Começamos com TXT (simples e direto), evoluímos para JSON (mais estruturado e moderno) e vimos como isso pode ser expandido para aplicações maiores.

Se você quer praticar ainda mais, tente integrar essa agenda com interface gráfica ou banco de dados – será um grande passo para transformar esse projeto em algo mais profissional.


💡 Desafio para você: implemente uma função que permita editar contatos já existentes (alterar telefone ou e-mail sem apagar o registro).

Comentários

Postagens mais visitadas deste blog

Laços de Repetição em Python: Conceitos e Exemplos Práticos

Manipulação de Arquivos no C#: Como Ler, Escrever e Trabalhar com Arquivos de Forma Simples

Como Instalar o Xamarin com C#: Passo a Passo Completo