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