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.

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.

TipoExemploQuando faz sentido
Relativotarefas.txt ou dados/notas.txtProjetos de estudo, arquivos ao lado do script
AbsolutoC:\Users\voce\projetos\tarefas.txtApontar 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.