Agenda de Contatos em Python – Salvando Dados em Arquivo
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:
- Leitura e escrita de arquivos ( - open(),- read(),- write()).
- Estruturas de dados em Python (listas e dicionários). 
- Serialização (salvar dicionários em JSON). 
- Criação de menus interativos no console. 
🔹 Estrutura da Agenda de Contatos
Nossa agenda terá os seguintes recursos:
- Adicionar contato (nome, telefone e e-mail). 
- Listar contatos salvos. 
- Buscar contato pelo nome. 
- Remover contato pelo nome. 
- Salvar contatos em arquivo (TXT ou JSON). 
- 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
| Formato | Vantagem | Desvantagem | 
|---|---|---|
| TXT | Simples, fácil de ler manualmente | Difícil de manipular, precisa de parsing manual | 
| JSON | Estruturado, compatível com APIs e bancos de dados | Arquivo 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:
- 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
Postar um comentário