Módulo 15 - Arquivos de texto
Prática: lista de tarefas que sobrevive ao fim do programa
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Gravar tarefas digitadas pelo usuário num arquivo usando o modo a.
- Listar as tarefas numeradas lendo o arquivo linha a linha com strip.
- Tratar o FileNotFoundError para o programa funcionar antes do arquivo existir.
- Montar o programa completo com menu, funções e o padrão with.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Prática: lista de tarefas que sobrevive ao fim do programa.
Os objetivos desta aula. Gravar tarefas digitadas pelo usuário num arquivo usando o modo a. Listar as tarefas numeradas lendo o arquivo linha a linha com strip. Tratar o FileNotFoundError para o programa funcionar antes do arquivo existir. Montar o programa completo com menu, funções e o padrão with.
Veja o essencial, parte por parte.
O plano do programa. O programa tem duas ações: adicionar tarefa (grava no tarefas.txt em modo a) e listar (lê e numera).
O código completo. Tente montar o programa sozinho a partir do plano antes de olhar a solução; travar e destravar é onde o aprendizado mora.
Desafios extras e a ponte para o projeto final. Mostre o total de tarefas no fim da listagem, usando len na lista que você montou.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
O plano do programa
Chegou a hora de juntar as cinco aulas num programa de verdade. A missão: uma lista de tarefas que não esquece. O usuário vê um menu com três opções: adicionar tarefa, listar tarefas e sair. Cada tarefa adicionada vai para o tarefas.txt, uma por linha, e a listagem lê o arquivo e mostra tudo numerado. Fechou o programa, abriu de novo, as tarefas continuam lá. É a primeira vez no curso que um programa seu tem memória de longo prazo.
Antes de escrever, pense nas decisões, porque cada uma vem de uma aula deste módulo. Para adicionar sem apagar as tarefas anteriores, o modo é a, nunca w: a aula 2 mostrou o estrago que o w faria aqui. Toda abertura usa with, o padrão firmado na aula 4, e declara encoding utf-8, o reflexo da aula 5, porque tarefa em português tem acento. E a listagem precisa sobreviver ao primeiro uso, quando o tarefas.txt ainda não existe: try/except FileNotFoundError, como a aula 3 ensinou. O menu com while e as funções vêm dos módulos 8 e 13. Nada aqui é novo; a novidade é a combinação.
- Função adicionar_tarefa: pede a descrição com input e grava no tarefas.txt em modo a, com quebra de linha.
- Função listar_tarefas: abre em modo r, percorre linha a linha, limpa com strip e imprime numerado.
- Proteção: se o arquivo não existe, avisa que ainda não há tarefas, sem quebrar.
- Menu com while: repete até o usuário escolher sair.
O código completo
Tente montar o programa sozinho a partir do plano antes de olhar a solução; travar e destravar é onde o aprendizado mora. Quando quiser conferir, aqui está uma solução completa, comentada e no padrão do curso.
ARQUIVO_TAREFAS = "tarefas.txt"
def adicionar_tarefa():
descricao = input("Qual tarefa deseja adicionar? ").strip()
if descricao == "":
print("Tarefa vazia não vale. Tente de novo.")
return
with open(ARQUIVO_TAREFAS, "a", encoding="utf-8") as arquivo:
arquivo.write(descricao + "\n")
print("Tarefa adicionada!")
def listar_tarefas():
try:
with open(ARQUIVO_TAREFAS, "r", encoding="utf-8") as arquivo:
tarefas = []
for linha in arquivo:
texto = linha.strip()
if texto != "":
tarefas.append(texto)
except FileNotFoundError:
print("Nenhuma tarefa cadastrada ainda.")
return
if len(tarefas) == 0:
print("Nenhuma tarefa cadastrada ainda.")
return
print("=== SUAS TAREFAS ===")
for numero, tarefa in enumerate(tarefas, start=1):
print(f"{numero}. {tarefa}")
while True:
print("\n1. Adicionar tarefa")
print("2. Listar tarefas")
print("3. Sair")
opcao = input("Escolha uma opção: ").strip()
if opcao == "1":
adicionar_tarefa()
elif opcao == "2":
listar_tarefas()
elif opcao == "3":
print("Até a próxima!")
break
else:
print("Opção inválida. Digite 1, 2 ou 3.")A lista de tarefas completa: modo a para adicionar, leitura numerada e resiliência ao arquivo ausente.
Rode no seu computador e faça o teste que dá sentido ao módulo: adicione duas tarefas, escolha sair, feche o terminal e rode o programa de novo. Escolha listar. As tarefas estão lá. Abra o tarefas.txt no Bloco de Notas e veja as linhas que o seu código escreveu. Repare também nos detalhes de acabamento: a tarefa vazia é recusada, a listagem pula linhas em branco, e o enumerate com start=1 numera a partir do 1, como gente conta. São os cuidados da aula 5 aplicados sem cerimônia.
Desafios extras e a ponte para o projeto final
O programa funciona; agora deixe-o com a sua cara. Os desafios abaixo estão em ordem de dificuldade, e cada um exige só ferramentas que você já tem. Não precisa fazer todos de uma vez: um por sessão de estudo já rende muito.
Repare no terceiro desafio: é o único uso legítimo do modo w neste programa, apagar de propósito, com confirmação. Se você entendeu por que ali o w é a escolha certa e no adicionar seria um desastre, o módulo cumpriu a missão.
E fica a ponte armada: este programa é a semente do projeto final. No módulo 16, ele cresce até virar o gerenciador de tarefas completo prometido lá no módulo 1, com marcar como concluída, remover tarefa e uma organização de funções mais caprichada. Cada linha que você escreveu aqui será reaproveitada e melhorada lá. Faça a mini-prova, garanta a medalha do módulo 15 e venha fechar o ciclo: falta um módulo para o seu primeiro sistema completo.
Teste rápido
Na função listar_tarefas, por que o with está dentro de um try/except FileNotFoundError?
Perguntas frequentes
- Por que adicionar usa o modo a e não o w?
- Porque o a preserva o conteúdo e escreve no fim: cada tarefa nova entra sem apagar as anteriores. Com w, cada tarefa adicionada destruiria a lista inteira e o arquivo teria sempre uma tarefa só, a última. É a pegadinha da aula 2 aplicada num caso real.
- Por que guardar as linhas numa lista antes de imprimir na listagem?
- Para separar a leitura da apresentação. Com a lista em mãos, dá para contar com len, filtrar linhas em branco e numerar com enumerate sem depender do arquivo aberto. É também o formato que o projeto final vai usar para concluir e remover tarefas.
- O que o enumerate com start=1 faz exatamente?
- Percorre a lista entregando pares: o número da posição e o item. O start=1 faz a contagem começar do 1 em vez do 0, então a primeira tarefa aparece como 1, a segunda como 2, e assim por diante. Sem ele, a numeração começaria do zero, que é natural para o Python e estranho para o usuário.
- Rodei o programa e o tarefas.txt não aparece na pasta. O que houve?
- Duas suspeitas: você ainda não adicionou nenhuma tarefa (o arquivo só nasce na primeira gravação) ou o terminal estava aberto em outra pasta na hora de executar, e o arquivo nasceu na pasta de trabalho de lá. Confira as duas antes de suspeitar do código. No Playground, lembre: os arquivos somem ao recarregar a página.
- Como eu removeria uma tarefa específica do arquivo?
- O padrão é: ler todas as tarefas para uma lista, remover o item na lista e regravar o arquivo inteiro em modo w com o que sobrou. Arquivos de texto não permitem apagar uma linha do meio diretamente. Esse é exatamente um dos passos do projeto final, no módulo 16.
- Posso usar este programa no meu dia a dia de verdade?
- Pode, e é um ótimo sinal usar algo que você mesmo escreveu. Ele é simples, mas honesto: as tarefas ficam num .txt que você abre em qualquer editor. Conforme os desafios extras e o projeto final entrarem, ele fica mais capaz. Muita ferramenta boa começou como um script pequeno de uso próprio.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.