
Passo 1 de 8
Do caminho ao arquivo aberto
Abra para leitura um arquivo representado por Path e observe como o bloco with controla seu fechamento.
Trilha de aprendizado · Nível 6 · Tutorial 4
Ler, criar e atualizar arquivos de texto com codificação explícita, escolhendo modos de abertura adequados e garantindo o fechamento na saída do bloco.
Do caminho ao arquivo aberto
Abra para leitura um arquivo representado por Path e observe como o bloco with controla seu fechamento. 3 min
Ler o conteúdo e reconhecer o fim do arquivo
Use read para obter o texto restante, observar o avanço da leitura e começar novamente ao reabrir o arquivo. 3 min
Ler linha por linha
Percorra um arquivo diretamente com for, diferencie linhas em branco do fim do arquivo e remova somente o terminador de cada linha. 3 min
Escolher o modo sem apagar dados por engano
Compare os modos r, w, a e x e escolha o efeito adequado para arquivos existentes ou ausentes. 3 min
Gravar textos e controlar as quebras de linha
Use write para gravar strings em UTF-8, acrescentar conteúdo sem unir linhas por engano e conferir o resultado por uma nova leitura. 3 min
Fechar o arquivo mesmo quando ocorre uma exceção
Observe como with fecha o arquivo durante a propagação de uma exceção, enquanto try e except cuidam do tratamento da falha — sem desfazer gravações. 3 min
Distinguir falhas de acesso e de codificação
Identifique se uma operação falhou por acesso, decodificação ou codificação e trate o problema sem ocultar perda de caracteres. 3 min
Aplicação final: criar, acrescentar e conferir
Integre os modos x, a, r e w em um fluxo local completo, confira os arquivos gerados e explique como o programa preserva os dados. 5 min

Passo 1 de 8
Abra para leitura um arquivo representado por Path e observe como o bloco with controla seu fechamento.
No seu editor, crie um arquivo chamado mensagem.txt na mesma pasta em que você salvará o script Python. Copie exatamente o conteúdo abaixo e confirme que o editor está configurado para salvar o arquivo em UTF-8.
O Path representará onde o arquivo está. Ele não é o arquivo aberto e não lê o conteúdo por conta própria.
Salve estas duas linhas no arquivo de texto:
Olá, Python!
Acentos: café, ação e você.Dica
As strings de Python são textos Unicode do tipo str. Ao abrir um arquivo de texto, encoding="utf-8" informa como interpretar o conteúdo armazenado. Declare a codificação compatível com a origem ou o formato do arquivo, em vez de depender do padrão do ambiente.
caminho é um objeto Path que representa o endereço mensagem.txt. A chamada open(...) usa esse caminho e retorna outro objeto: o arquivo aberto.
Em with open(...) as arquivo:, o nome arquivo recebe esse objeto durante o bloco. O modo "r" indica abertura para leitura.
A abertura transforma a referência ao caminho em um objeto de arquivo utilizável. O limite do bloco with determina por quanto tempo esse objeto permanece aberto.

O Path continua representando o endereço; o objeto retornado por open é aberto dentro do with e fechado ao sair normalmente.
Salve o código abaixo como abrir_mensagem.py, na mesma pasta de mensagem.txt, e execute o script. O atributo closed informa se o objeto de arquivo está fechado.
Compare o valor de closed dentro e depois do bloco.
from pathlib import Path
caminho = Path("mensagem.txt")
with open(caminho, mode="r", encoding="utf-8") as arquivo:
print("Dentro do with:", arquivo.closed)
print("Depois do with:", arquivo.closed)Exemplo
Dentro do bloco, o objeto está aberto; após a saída normal, está fechado:
Dentro do with: FalseDepois do with: True
O nome arquivo ainda referencia o mesmo objeto, mas ele já foi fechado. Fechar libera o recurso usado pelo programa: não exclui mensagem.txt do computador.
Relacione os elementos do código com o papel que desempenham.
Toque em um item e depois no par correspondente.

Passo 2 de 8
Use read para obter o texto restante, observar o avanço da leitura e começar novamente ao reabrir o arquivo.
Dentro do bloco with, arquivo.read() retorna como str todo o conteúdo restante a partir da posição atual. A leitura avança essa posição até o fim do arquivo.
Como o texto retornado fica inteiro em memória, essa forma é adequada ao pequeno arquivo desta prática. Arquivos muito grandes exigem outra estratégia, que não será abordada agora.

Depois de ler todo o conteúdo, a posição permanece no fim; uma nova chamada não volta automaticamente ao início.
O modo de abertura e o encoding permanecem explícitos. Ajuste apenas o nome do arquivo se necessário.
from pathlib import Path
caminho = Path("leitura.txt")
with open(caminho, "r", encoding="utf-8") as arquivo:
conteudo = arquivo.read()
print(conteudo)No seu editor, crie leitura.txt na mesma pasta do script e salve-o em UTF-8 com estas duas linhas:
Café quente
Pão de queijo
Execute o código abaixo. Uma eventual quebra de linha no final também faz parte do conteúdo lido.
A segunda chamada ocorre no mesmo objeto de arquivo. Depois, uma nova abertura cria outra leitura iniciada no começo.
from pathlib import Path
caminho = Path("leitura.txt")
with open(caminho, "r", encoding="utf-8") as arquivo:
primeira = arquivo.read()
segunda = arquivo.read()
print("Primeira leitura:")
print(primeira)
print("Segunda leitura está vazia?", segunda == "")
with open(caminho, "r", encoding="utf-8") as arquivo:
terceira = arquivo.read()
print("A reabertura leu o mesmo conteúdo?", terceira == primeira)Dica
A string vazia da segunda chamada significa que não há mais conteúdo restante naquela leitura. O texto continua armazenado no arquivo, como a reabertura confirma.
Complete com um literal Python: depois que arquivo.read() consumiu todo o conteúdo, outra chamada no mesmo objeto retorna _.
Após duas chamadas consecutivas de read(), a segunda retornou "". O arquivo é fechado e aberto novamente em modo r. O que a próxima chamada de read() retorna?

Passo 3 de 8
Percorra um arquivo diretamente com for, diferencie linhas em branco do fim do arquivo e remova somente o terminador de cada linha.
Dentro do bloco with, o próprio objeto de arquivo pode ser percorrido com for. A cada repetição, linha recebe uma str correspondente à próxima linha do arquivo.
Na configuração padrão do modo texto, a string normalmente termina com \n. Há duas situações importantes:
"\n" e participa do percurso;\n.O fim do arquivo não é uma linha adicional: quando ele é alcançado, o for simplesmente termina.
O diagrama torna visíveis os caracteres que normalmente não aparecem na tela.

A linha em branco ainda contém um caractere; o fim do arquivo não produz outra linha.
No editor, crie linhas.txt na mesma pasta do script e salve-o em UTF-8. Digite quatro linhas:
cafénota e acrescente dois espaços depois da palavrafimSe o editor permitir, deixe a quarta linha sem uma quebra no final. Os pontos · exibidos pelo programa representarão espaços; não digite esses pontos no arquivo.
Execute este script na pasta que contém linhas.txt.
from pathlib import Path
caminho = Path("linhas.txt")
with open(caminho, "r", encoding="utf-8") as arquivo:
for numero, linha in enumerate(arquivo, start=1):
visivel = linha.replace(" ", "·").replace("\n", "\\n")
sem_terminador = linha.rstrip("\n")
resultado = sem_terminador.replace(" ", "·")
print(f"{numero}: {visivel} -> {resultado}")Exemplo
Se o arquivo tiver exatamente a estrutura solicitada, a saída será semelhante a:
1: café\n -> café
2: \n ->
3: nota··\n -> nota··
4: fim -> fimA linha 2 foi percorrida porque continha \n. Depois da linha 4, o laço terminou sem produzir uma quinta linha.
A expressão linha.rstrip("\n") remove caracteres \n apenas do final da string. Por isso, os dois espaços depois de nota continuam presentes.
Uma limpeza mais ampla poderia remover também espaços que fazem parte dos dados. A última linha, que já não possui \n, permanece inalterada.
Dica
Use read() quando precisar trabalhar com todo o texto de uma vez. Use for linha in arquivo quando quiser processar uma linha por vez, mantendo apenas a linha atual como foco do processamento.
Com base no resultado do seu programa, explique:
nota após rstrip("\n");Escreva pelo menos 100 caracteres (0/100).

Passo 4 de 8
Compare os modos r, w, a e x e escolha o efeito adequado para arquivos existentes ou ausentes.
O argumento mode deve refletir sua intenção:
| Modo | Intenção | Se o arquivo existe | Se não existe |
|---|---|---|---|
| r | Ler | Abre para leitura | Gera FileNotFoundError |
| w | Substituir | Apaga o conteúdo imediatamente | Cria o arquivo |
| a | Acrescentar ao final | Preserva o conteúdo anterior | Cria o arquivo |
| x | Criar somente se for novo | Gera FileExistsError | Cria o arquivo |
A escolha acontece na abertura, por exemplo: open(caminho, mode="r", encoding="utf-8").

Observe principalmente a diferença entre preservar, esvaziar e recusar um arquivo existente.
Atenção
Se o destino já existir, o modo w trunca o arquivo durante a abertura. Isso significa que o conteúdo anterior desaparece antes de qualquer operação posterior no bloco — mesmo que nenhuma gravação chegue a ocorrer.
Exemplo
Considere que relatorio.txt contém várias linhas:
with open("relatorio.txt", mode="w", encoding="utf-8") as arquivo:
print("Arquivo aberto")Ao terminar, relatorio.txt existe, mas está vazio. O modo w só deve ser escolhido quando a substituição for intencional.
Use a quando o novo conteúdo deve ficar depois do conteúdo existente. Ele preserva o que já está no arquivo, mas não serve para editar ou substituir trechos no meio.
Use x quando a criação só pode acontecer se o destino ainda não existir. Se já existir, a abertura gera FileExistsError e preserva seu conteúdo.
Dica
Uma consulta prévia com exists() não garante que o caminho continuará livre até a abertura. Com x, a própria tentativa de criação recusa um destino que já exista.
Relacione cada situação ao modo de abertura correto.
Toque em um item e depois no par correspondente.

Passo 5 de 8
Use write para gravar strings em UTF-8, acrescentar conteúdo sem unir linhas por engano e conferir o resultado por uma nova leitura.
write recebe uma str e grava seu conteúdo sem adicionar espaços ou quebras de linha. Por isso, chamadas como write("Café") e write(" com pão") produzem Café com pão na mesma linha.
Para separar linhas, inclua \n explicitamente. No modo texto, Python usa as convenções de terminadores do ambiente durante a escrita padrão. Ao ler novamente em modo texto, você normalmente observa esses terminadores como \n.

Sem \n, os textos ficam lado a lado. Com \n, o conteúdo seguinte começa em outra linha.
Execute o código em uma pasta de teste no seu computador. Na primeira execução, x cria notas_utf8.txt. Se esse arquivo já existir por causa de uma execução anterior, apague-o manualmente antes de repetir a prática.
O segundo arquivo é propositalmente aberto duas vezes com w, para tornar visível a substituição intencional de seu conteúdo.
Salve como um script Python e execute-o. Todos os textos e caminhos necessários estão no código.
from pathlib import Path
pasta = Path("pratica_texto")
pasta.mkdir(exist_ok=True)
anotacoes = pasta / "notas_utf8.txt"
# Criação protegida: falha se o arquivo já existir.
with open(anotacoes, "x", encoding="utf-8") as arquivo:
arquivo.write("Café")
arquivo.write(" com pão")
# O primeiro \n separa o acréscimo da linha já existente.
with open(anotacoes, "a", encoding="utf-8") as arquivo:
arquivo.write("\nRevisão às 14h")
arquivo.write("\nPróxima ação: praticar.")
with open(anotacoes, "r", encoding="utf-8") as arquivo:
conteudo = arquivo.read()
print("ANOTAÇÕES:")
print(conteudo)
# Arquivo separado para testar uma substituição intencional.
teste = pasta / "substituicao.txt"
with open(teste, "w", encoding="utf-8") as arquivo:
arquivo.write("Versão antiga\n")
with open(teste, "w", encoding="utf-8") as arquivo:
arquivo.write("Versão nova: ação concluída\n")
with open(teste, "r", encoding="utf-8") as arquivo:
substituido = arquivo.read()
print("TESTE DE SUBSTITUIÇÃO:")
print(substituido)Exemplo
A nova abertura para leitura deve preservar os acentos e mostrar:
ANOTAÇÕES:
Café com pão
Revisão às 14h
Próxima ação: praticar.
TESTE DE SUBSTITUIÇÃO:
Versão nova: ação concluídaAs duas primeiras chamadas de write foram concatenadas na ordem da gravação. Já os \n do acréscimo criaram as mudanças de linha. No arquivo de substituição, a segunda abertura com w removeu a versão antiga antes da nova gravação.
Dica
O modo a posiciona a gravação no final, mas não cria uma separação. Se o conteúdo existente for Café com pão sem terminador e você acrescentar Revisão às 14h, o resultado será Café com pãoRevisão às 14h. Quando você sabe que falta o terminador final, grave "\nRevisão às 14h" para começar uma nova linha sem substituir o conteúdo anterior.
Execute o código e relate o conteúdo obtido em notas_utf8.txt e substituicao.txt. Depois explique o que aconteceria se o primeiro \n do bloco aberto com a fosse removido e como evitar essa concatenação sem apagar o conteúdo anterior.
Escreva pelo menos 100 caracteres (0/100).

Passo 6 de 8
Observe como with fecha o arquivo durante a propagação de uma exceção, enquanto try e except cuidam do tratamento da falha — sem desfazer gravações.
Se uma exceção ocorrer depois que o arquivo foi aberto e o bloco with começou, a saída do bloco também fecha o arquivo. Depois disso, a exceção continua se propagando.
O with fecha o recurso, mas não trata nem silencia a falha. Para tratar uma exceção específica da abertura ou do uso do arquivo, coloque o with dentro de um try e escreva o except adequado.

A exceção faz o fluxo sair do bloco; o fechamento ocorre antes de o tratamento no except começar.
Execute este script em uma pasta de teste. Ele prepara um arquivo descartável, reabre esse arquivo com w, grava uma linha e provoca intencionalmente um ValueError.
from pathlib import Path
caminho = Path("interrompido.txt")
# Prepara um conteúdo anterior para tornar o efeito de "w" visível.
with open(caminho, "w", encoding="utf-8") as inicial:
inicial.write("conteúdo anterior\n")
arquivo = None
try:
with open(caminho, "w", encoding="utf-8") as arquivo:
arquivo.write("linha gravada antes da falha\n")
print("Dentro do bloco, fechado?", arquivo.closed)
raise ValueError("falha provocada para a demonstração")
except ValueError as erro:
print("Falha tratada:", erro)
print("Depois do bloco, fechado?", arquivo.closed)
with open(caminho, "r", encoding="utf-8") as conferencia:
print("Conteúdo final:", repr(conferencia.read()))Atenção
Ao abrir o arquivo com w, o conteúdo anterior é truncado imediatamente. A linha gravada antes do raise também não é desfeita. O fechamento libera o recurso, mas não restaura dados nem reverte alterações já realizadas.
O bloco depois de as só é executado se open conseguir abrir o arquivo. Se a própria abertura falhar, por exemplo com uma exceção de acesso, não existe um novo arquivo aberto por esse with para ser usado no corpo.
Um try ao redor do with pode tratar uma falha específica da abertura ou do corpo. No exemplo anterior, porém, o except ValueError trata apenas o erro provocado; ele não captura indiscriminadamente outras falhas.
Exemplo
A saída deve indicar False dentro do bloco e True depois dele. O conteúdo final será 'linha gravada antes da falha\n': o arquivo foi fechado e o ValueError foi tratado, mas o conteúdo anterior não foi recuperado.
Considere a demonstração em que a abertura foi bem-sucedida. Coloque os eventos na ordem em que acontecem.
Na demonstração, o arquivo estará fechado quando a execução alcançar o bloco except.
O with, sozinho, trata e silencia o ValueError levantado dentro do bloco.
Quando o arquivo é fechado por causa da exceção, o conteúdo anterior ao uso do modo w é restaurado automaticamente.

Passo 7 de 8
Identifique se uma operação falhou por acesso, decodificação ou codificação e trate o problema sem ocultar perda de caracteres.
Falhas de acesso, como FileNotFoundError, PermissionError e IsADirectoryError, estão relacionadas à localização ou ao acesso ao arquivo.
Já os erros de codificação envolvem a conversão entre o texto do programa e o conteúdo armazenado:
UnicodeDecodeError: ao ler, a codificação escolhida não conseguiu interpretar o conteúdo como texto.UnicodeEncodeError: ao escrever, a codificação escolhida não conseguiu representar algum caractere da str.São problemas diferentes e devem produzir mensagens diferentes.

Acesso impede ou interrompe a operação no sistema de arquivos; decodificação ocorre na leitura; codificação ocorre na escrita.
Execute o código em uma pasta na qual você tenha permissão de escrita. Ele cria dois arquivos separados: um para provocar uma falha de leitura e outro para provocar uma falha de escrita. As mensagens de sucesso aparecem apenas no else, quando a operação realmente termina.
from pathlib import Path
pasta = Path("pratica_encoding")
pasta.mkdir(exist_ok=True)
origem = pasta / "origem_utf8.txt"
destino = pasta / "saida_ascii.txt"
# Prepara um texto válido em UTF-8.
with open(origem, "w", encoding="utf-8") as arquivo:
arquivo.write("Café, ação e coração.\n")
# ASCII não consegue interpretar os caracteres acentuados desse arquivo.
try:
with open(origem, "r", encoding="ascii") as arquivo:
texto = arquivo.read()
except UnicodeDecodeError as erro:
print("Falha de decodificação:", erro)
except OSError as erro:
print("Falha de acesso durante a leitura:", erro)
else:
print("Leitura concluída:", texto)
# ASCII também não consegue representar os acentos durante a escrita.
try:
with open(destino, "w", encoding="ascii") as arquivo:
arquivo.write("Café, ação e coração.\n")
except UnicodeEncodeError as erro:
print("Falha de codificação:", erro)
except OSError as erro:
print("Falha de acesso durante a escrita:", erro)
else:
print("Gravação concluída.")Exemplo
A primeira falha é UnicodeDecodeError: o conteúdo gravado em UTF-8 não pôde ser lido como ASCII. A segunda é UnicodeEncodeError: a string com acentos não pôde ser gravada usando ASCII.
O with fecha os arquivos nas duas situações, mas não transforma as operações em sucessos nem desfaz efeitos anteriores, como a criação ou o truncamento de saida_ascii.txt pelo modo w.
Atenção
Evite resolver a falha apenas adicionando errors="ignore". Por exemplo, ler o arquivo UTF-8 da prática como ASCII com essa opção pode produzir algo semelhante a Caf, ao e corao.. O programa continua, mas caracteres foram descartados silenciosamente.
Substituições automáticas também podem alterar o texto sem preservar os caracteres originais. Uma operação incompleta não deve ser apresentada como bem-sucedida.
Dica
Use a codificação definida pela origem ou pelo formato do arquivo. Não tente apenas várias opções até uma delas deixar de gerar erro: uma escolha incorreta pode aceitar o conteúdo e ainda produzir caracteres alterados. Além disso, certos textos contêm apenas caracteres compatíveis com várias codificações; nesse caso, uma escolha inadequada pode não provocar exceção imediatamente.
Relacione cada situação ao tipo de falha esperado.
Toque em um item e depois no par correspondente.
Uma leitura gera UnicodeDecodeError. Qual é a resposta mais adequada?

Passo 8 de 8
Integre os modos x, a, r e w em um fluxo local completo, confira os arquivos gerados e explique como o programa preserva os dados.
Você executará um roteiro completo em uma pasta de teste no seu computador. O programa criará anotacoes.txt com proteção contra sobrescrita, acrescentará outra anotação, produzirá resumo.txt e lerá os resultados para conferência.
Ao final, uma nova tentativa de criação exclusiva mostrará que a falha não apaga o conteúdo existente.
A sequência combina quatro intenções: criar com proteção, acrescentar sem substituir, ler linha por linha e gerar uma saída substituível.

O arquivo de anotações é preservado; somente o resumo descartável pode ser substituído a cada execução planejada.
Atenção
Salve o código como um script em uma pasta de prática. Antes da primeira execução, confirme que a subpasta pratica_arquivos não contém anotacoes.txt nem resumo.txt. O modo w substituirá intencionalmente o resumo, enquanto x impedirá a substituição das anotações.
Execute este script no seu computador e observe a saída do terminal. Todos os arquivos usados por ele ficam na subpasta pratica_arquivos.
from pathlib import Path
pasta = Path("pratica_arquivos")
pasta.mkdir(exist_ok=True)
anotacoes = pasta / "anotacoes.txt"
resumo = pasta / "resumo.txt"
# x: cria um arquivo novo e recusa um destino já existente.
with open(anotacoes, "x", encoding="utf-8") as arquivo:
arquivo.write("Revisar funções\n")
arquivo.write("Praticar arquivos\n")
# a: preserva o conteúdo e acrescenta uma linha ao final.
with open(anotacoes, "a", encoding="utf-8") as arquivo:
arquivo.write("Conferir acentuação: ação e café\n")
# r: percorre as anotações; w: recria o resumo descartável.
with open(resumo, "w", encoding="utf-8") as saida:
with open(anotacoes, "r", encoding="utf-8") as entrada:
for numero, linha in enumerate(entrada, start=1):
texto = linha.rstrip("\n")
saida.write(f"{numero}. {texto}\n")
# Nova abertura permite conferir o resumo desde o início.
with open(resumo, "r", encoding="utf-8") as arquivo:
print("Resumo gerado:")
print(arquivo.read())
# A criação exclusiva repetida falha, mas não altera o arquivo existente.
try:
with open(anotacoes, "x", encoding="utf-8") as arquivo:
arquivo.write("Este texto não será gravado.\n")
except FileExistsError:
print("Criação repetida bloqueada: anotacoes.txt já existe.")
with open(anotacoes, "r", encoding="utf-8") as arquivo:
print("Anotações preservadas:")
print(arquivo.read())Exemplo
A saída deverá manter os acentos e a separação entre as linhas:
Resumo gerado:1. Revisar funções2. Praticar arquivos3. Conferir acentuação: ação e café
Criação repetida bloqueada: anotacoes.txt já existe.Anotações preservadas:Revisar funçõesPraticar arquivosConferir acentuação: ação e café
O resumo.txt deverá conter as três linhas numeradas. O anotacoes.txt continuará com as três anotações originais.
Depois de executar o roteiro, descreva o que apareceu no terminal e nos dois arquivos. Justifique os quatro modos utilizados e explique por que a segunda abertura com x falhou sem apagar as anotações. Por fim, diferencie o fechamento feito por with do tratamento feito por except e de um possível desfazimento de alterações.
Escreva pelo menos 180 caracteres (0/180).
Resumo
Ao lidar com texto, escolha cada opção conforme a intenção e o formato conhecido, sem ocultar falhas.
r para ler um arquivo existente, w para substituí-lo intencionalmente, a para acrescentar ao final e x para criar sem sobrescrever.encoding de acordo com a origem ou o formato do texto; UTF-8 é uma escolha explícita quando compatível.read() para obter o conteúdo restante ou percorra o arquivo com for para processar uma linha de cada vez.\n quando quiser separar linhas, pois write() não cria essa separação automaticamente.with para garantir o fechamento; use try e except separadamente para tratar falhas específicas.UnicodeDecodeError e UnicodeEncodeError, sem recorrer a perdas silenciosas de caracteres.Parabéns! Você concluiu: Ler e gravar arquivos de texto com with
100 XP
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks