Módulo 15 - Arquivos de texto
Cuidados ao salvar dados: acentos, validação e caminhos
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Usar encoding utf-8 no open para acentos funcionarem em qualquer máquina.
- Reconhecer o sintoma clássico de acento quebrado ao ler ou escrever no Windows.
- Validar o conteúdo lido de um arquivo antes de usar, sem confiança cega.
- Diferenciar caminho relativo de caminho absoluto na hora de abrir arquivos.
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: Cuidados ao salvar dados: acentos, validação e caminhos.
Os objetivos desta aula. Usar encoding utf-8 no open para acentos funcionarem em qualquer máquina. Reconhecer o sintoma clássico de acento quebrado ao ler ou escrever no Windows. Validar o conteúdo lido de um arquivo antes de usar, sem confiança cega. Diferenciar caminho relativo de caminho absoluto na hora de abrir arquivos.
Veja o essencial, parte por parte.
Acentos e o encoding utf-8. No Windows, o Python pode gravar e ler arquivos com uma tabela de caracteres antiga, e os acentos quebram.
Não confie cegamente no que leu. Segundo cuidado, e este é uma mentalidade: dado que veio de arquivo merece a mesma desconfiança que dado que veio do input.
Caminho relativo e absoluto, numa pincelada honesta. Último cuidado, de tamanho proposital: uma pincelada, sem mergulho.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Acentos e o encoding utf-8
Quem programa em português no Windows esbarra cedo ou tarde nesta cena: o script grava a palavra ação num arquivo, e ao abrir em outro programa aparece um ação de aparência alienígena, ou a leitura explode com um UnicodeDecodeError. O motivo é histórico. Para gravar texto, o computador traduz cada caractere num número usando uma tabela chamada encoding, e o Windows em português carrega por padrão uma tabela antiga, a cp1252, enquanto boa parte do mundo já fala UTF-8, o padrão universal que cobre acentos, ç e até emojis. Escrita com uma tabela e leitura com outra produzem exatamente essa salada de símbolos.
A defesa é simples e cabe numa regra só: declare a tabela explicitamente, em todo open, passando encoding="utf-8". Vale para escrever e para ler, sem exceção. Assim o comportamento do seu programa deixa de depender da configuração da máquina onde ele roda, e o arquivo criado no seu Windows abre certinho no Linux do colega ou no servidor de um curso.
with open("recado.txt", "w", encoding="utf-8") as arquivo:
arquivo.write("Atenção: reunião às 14h no coração da cidade.\n")
with open("recado.txt", "r", encoding="utf-8") as arquivo:
print(arquivo.read())
# Saída, com todos os acentos intactos:
# Atenção: reunião às 14h no coração da cidade.O encoding declarado nos dois opens garante os acentos em qualquer sistema. Adote como reflexo.
Não confie cegamente no que leu
Segundo cuidado, e este é uma mentalidade: dado que veio de arquivo merece a mesma desconfiança que dado que veio do input. No módulo 14 você blindou a calculadora contra o usuário que digita banana no lugar do número. Pois o arquivo pode conter a mesma banana: alguém editou no Bloco de Notas, uma linha ficou em branco, uma versão antiga do seu programa gravou num formato diferente. O arquivo é só um texto no disco; nada garante que o conteúdo é o que o seu código espera.
# notas.txt deveria ter um número por linha, mas quem garante?
soma = 0.0
quantidade = 0
with open("notas.txt", "r", encoding="utf-8") as arquivo:
for linha in arquivo:
texto = linha.strip()
if texto == "":
continue # pula linha em branco
try:
soma = soma + float(texto)
quantidade = quantidade + 1
except ValueError:
print("Linha ignorada, não é número:", texto)
if quantidade > 0:
print("Média:", soma / quantidade)
else:
print("Nenhuma nota válida no arquivo.")Leitura defensiva: pula linha vazia, ignora o que não é número e ainda avisa. Nada quebra.
Repare em quantos módulos do curso trabalham juntos nesse exemplo: with e strip deste módulo, try/except e ValueError do módulo 14, float do módulo 5, if e continue dos módulos 7 e 9, acumuladores do módulo 8. É assim que programas reais são: pequenas peças conhecidas, combinadas com intenção. A regra que fica é curta: leu do arquivo, limpou com strip, validou antes de converter e usou. Confiança cega em conteúdo de arquivo é aposta, não engenharia.
Caminho relativo e absoluto, numa pincelada honesta
Último cuidado, de tamanho proposital: uma pincelada, sem mergulho. Até aqui, todo open recebeu só um nome, como tarefas.txt. Isso é um caminho relativo: o Python procura o arquivo a partir da pasta de trabalho, que em geral é a pasta do script. Funciona muito bem enquanto você roda os programas de dentro da pasta de projetos, e é o que este curso usa. Mas existe outra forma: o caminho absoluto, o endereço completo desde a raiz do disco, como C:\Users\voce\projetos-python\tarefas.txt, que aponta para o mesmo lugar não importa de onde o programa rode.
| Tipo | Exemplo | Quando faz sentido |
|---|---|---|
| Relativo | tarefas.txt ou dados/notas.txt | Projetos de estudo, arquivos ao lado do script |
| Absoluto | C:\Users\voce\projetos\tarefas.txt | Apontar um lugar fixo, independente de onde rodar |
Os dois tipos de endereço. Neste curso, o relativo resolve; o absoluto fica no radar.
A honestidade prometida: caminhos têm sutilezas, como a barra invertida do Windows dentro de textos do Python e a pasta de trabalho que muda conforme o jeito de executar. Ferramentas dedicadas a isso existem na biblioteca padrão e pertencem à próxima etapa da trilha. Para este curso e para o projeto final, guarde o essencial: use nomes simples, rode o script de dentro da pasta dele, e o arquivo estará sempre onde você espera. Se um FileNotFoundError aparecer com um arquivo que existe, a primeira suspeita é a pasta de trabalho: veja em qual pasta o terminal estava quando você executou.
Teste rápido
Por que declarar encoding="utf-8" nos opens do seu programa?
Perguntas frequentes
- Preciso do encoding mesmo se o meu texto não tem acento?
- Precisa do hábito. Hoje o texto não tem acento; amanhã alguém acrescenta um ç e o defeito aparece longe da causa. Declarar encoding="utf-8" em todo open custa nada e elimina uma classe inteira de surpresas. Trate como parte da assinatura padrão do open.
- O que é exatamente aquele ç que aparece no lugar do ç?
- É o sintoma da tabela trocada: o ç gravado em UTF-8 ocupa dois números, e uma leitura com a tabela antiga do Windows interpreta cada número como um caractere separado. Nasce o par estranho. O conteúdo não se perdeu; foi só traduzido com o dicionário errado. Reler com utf-8 mostra o texto certo.
- Por que validar o arquivo se fui eu mesmo que gravei?
- Porque o arquivo fica exposto entre uma execução e outra: pode ser editado no Bloco de Notas, truncado por uma falha, ou gravado por uma versão antiga do seu programa com outro formato. Validar na leitura custa poucas linhas e transforma surpresa em mensagem educada, exatamente como você fez com o input no módulo 14.
- Qual caminho devo usar nos exercícios do curso, relativo ou absoluto?
- Relativo, só o nome do arquivo, como tarefas.txt. Rodando o script de dentro da sua pasta de projetos, o arquivo nasce e é encontrado ali mesmo. O caminho absoluto resolve casos específicos e traz sutilezas do Windows que não valem a pena agora.
- Meu FileNotFoundError aponta um arquivo que eu vejo na pasta. Como?
- Quase sempre a pasta de trabalho não é a que você imagina: o terminal estava aberto em outra pasta quando você executou o script. Confira a pasta atual do terminal e execute de dentro da pasta do arquivo. Outra causa comum é extensão escondida: o arquivo se chama tarefas.txt.txt e o Windows mostra só tarefas.txt.
- UTF-8 dá conta de emojis e de outros idiomas?
- Dá. O UTF-8 cobre praticamente toda a escrita humana: acentos do português, ideogramas, alfabetos inteiros e emojis. É por isso que virou o padrão da web e a recomendação para arquivos novos. Declarando utf-8, o seu programa está pronto para qualquer texto que aparecer.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.