Trilha de aprendizado · Nível 6 · Tutorial 4

Ler e gravar arquivos de texto com with

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.

  • Nível: Intermediário
  • Duração: 25 min
  • 8 passos
Ler e gravar arquivos de texto com with

O que você vai percorrer

  1. Do caminho ao arquivo aberto Abra para leitura um arquivo representado por Path e observe como o bloco with controla seu fechamento. 3 min
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

O que você vai aprender

  • Abrir arquivos a partir de caminhos Path e ler o conteúdo inteiro ou percorrer suas linhas.
  • Escolher entre leitura, substituição, acréscimo e criação exclusiva conforme a operação desejada.
  • Gravar textos com encoding explícito e controlar as quebras de linha.
  • Usar with para fechar o arquivo na saída normal ou por exceção.
  • Distinguir problemas de acesso de falhas de codificação, sem descartar caracteres silenciosamente.

Antes de começar

  • Manipular caminhos com pathlib
  • Tratar exceções com try, except, else e finally
  • Percorrer textos e intervalos com for e range
  • Dividir, unir e normalizar textos

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.

Prepare o arquivo da prática

Um arquivo local em UTF-8

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.

Conteúdo de mensagem.txt

Salve estas duas linhas no arquivo de texto:

text
Olá, Python!
Acentos: café, ação e você.

Dica

Por que declarar UTF-8?

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.

Do Path ao objeto de arquivo

Responsabilidades diferentes

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.

O ciclo de abertura normal

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.

Diagrama mostrando um Path entrando em uma operação de abertura, um objeto de arquivo aberto dentro do bloco with e o mesmo objeto fechado após a saída.

O Path continua representando o endereço; o objeto retornado por open é aberto dentro do with e fechado ao sair normalmente.

Observe o fechamento

Execute no seu computador

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.

Abrir com with

Compare o valor de closed dentro e depois do bloco.

python
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

Saída esperada

Dentro do bloco, o objeto está aberto; após a saída normal, está fechado:

Dentro do with: False
Depois 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.

Quem faz o quê?

Associe cada elemento à sua responsabilidade

Relacione os elementos do código com o papel que desempenham.

Toque em um item e depois no par correspondente.

Passo 2 de 8

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.

O que read retorna

Da posição atual até o fim

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.

A posição avança durante a leitura

Diagrama em três estados: posição no início do arquivo, leitura de todo o conteúdo e posição no fim.

Depois de ler todo o conteúdo, a posição permanece no fim; uma nova chamada não volta automaticamente ao início.

Leitura integral

O modo de abertura e o encoding permanecem explícitos. Ajuste apenas o nome do arquivo se necessário.

python
from pathlib import Path

caminho = Path("leitura.txt")

with open(caminho, "r", encoding="utf-8") as arquivo:
    conteudo = arquivo.read()

print(conteudo)

Duas leituras e uma reabertura

Experimento local

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.

Observe o fim da leitura

A segunda chamada ocorre no mesmo objeto de arquivo. Depois, uma nova abertura cria outra leitura iniciada no começo.

python
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

Fim da leitura não apaga o arquivo

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.

Preveja a segunda chamada

No fim do arquivo

Complete com um literal Python: depois que arquivo.read() consumiu todo o conteúdo, outra chamada no mesmo objeto retorna _.

O que acontece ao reabrir?

Nova abertura

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

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.

O que o for recebe

Uma string por 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:

  • uma linha em branco pode ser representada por "\n" e participa do percurso;
  • a última linha pode conter texto sem terminar com \n.

O fim do arquivo não é uma linha adicional: quando ele é alcançado, o for simplesmente termina.

Anatomia das linhas lidas

O diagrama torna visíveis os caracteres que normalmente não aparecem na tela.

Quatro linhas empilhadas: uma linha comum com terminador, uma linha contendo apenas terminador, uma linha com espaços antes do terminador e uma última linha sem terminador, seguida pelo fim do arquivo.

A linha em branco ainda contém um caractere; o fim do arquivo não produz outra linha.

Experimento local

Prepare o arquivo

No editor, crie linhas.txt na mesma pasta do script e salve-o em UTF-8. Digite quatro linhas:

  1. café
  2. deixe esta linha em branco
  3. digite nota e acrescente dois espaços depois da palavra
  4. digite fim

Se 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.

Percorra e torne os caracteres visíveis

Execute este script na pasta que contém linhas.txt.

python
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

Resultado esperado

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 -> fim

A linha 2 foi percorrida porque continha \n. Depois da linha 4, o laço terminou sem produzir uma quinta linha.

Remova somente o terminador

Preserve os espaços relevantes

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

Quando usar cada leitura

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.

Explique o que aconteceu

Linha em branco, última linha e fim do arquivo

Com base no resultado do seu programa, explique:

  • por que a linha em branco foi percorrida;
  • quais caracteres permaneceram na linha de nota após rstrip("\n");
  • como a última linha sem terminador se diferencia do fim do arquivo.

Escreva pelo menos 100 caracteres (0/100).

Passo 4 de 8

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.

Quatro modos, quatro intenções

A abertura já define o que pode acontecer

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").

Efeito de cada modo

Diagrama com quatro caminhos: r acessa um arquivo existente, w transforma um arquivo existente em um arquivo vazio, a mantém o conteúdo e aponta para o final, e x cria um arquivo somente quando ele ainda não existe.

Observe principalmente a diferença entre preservar, esvaziar e recusar um arquivo existente.

O risco do modo w

Atenção

Abrir com w já pode destruir dados

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

Preveja o efeito

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.

Preservar ou proteger

a acrescenta; x protege a criação

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

Prefira x a verificar e depois criar

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.

Associe intenção e modo

Escolha o modo adequado

Relacione cada situação ao modo de abertura correto.

Toque em um item e depois no par correspondente.

Passo 5 de 8

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.

write grava exatamente o que você fornece

Nada é acrescentado automaticamente

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.

Concatenação e separação de linhas

Diagrama comparando blocos gravados em sequência, primeiro unidos na mesma linha e depois separados por uma quebra de linha.

Sem \n, os textos ficam lado a lado. Com \n, o conteúdo seguinte começa em outra linha.

Prática local: criar, acrescentar e substituir

Prepare arquivos descartáveis

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.

Gravação completa com x, a, w e UTF-8

Salve como um script Python e execute-o. Todos os textos e caminhos necessários estão no código.

python
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)

Confira as fronteiras entre linhas

Exemplo

Resultado esperado

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ída

As 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

Atenção ao primeiro texto acrescentado

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.

Explique o que você observou

Relato da prática

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

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.

Fechamento e tratamento são responsabilidades diferentes

O que acontece na saída por exceção

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.

Fluxo de uma saída por exceção

Diagrama em cinco etapas: arquivo aberto, texto gravado, exceção levantada, arquivo fechado e fluxo direcionado ao tratamento.

A exceção faz o fluxo sair do bloco; o fechamento ocorre antes de o tratamento no except começar.

Demonstração local

Provoque uma falha conhecida

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.

Escrita interrompida por uma exceção

python
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

Fechar não significa desfazer

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.

E se a abertura falhar?

O corpo do with só começa após a abertura

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

Leitura correta da demonstração

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.

Verifique o fluxo e os efeitos

Ordene a execução

Considere a demonstração em que a abertura foi bem-sucedida. Coloque os eventos na ordem em que acontecem.

  1. O arquivo é aberto com modo w, truncando o conteúdo anterior.
  2. O raise provoca um ValueError.
  3. A nova linha é gravada.
  4. O except ValueError trata a exceção.
  5. A saída do with fecha o arquivo.

Estado do arquivo

Na demonstração, o arquivo estará fechado quando a execução alcançar o bloco except.

Tratamento da falha

O with, sozinho, trata e silencia o ValueError levantado dentro do bloco.

Conteúdo do arquivo

Quando o arquivo é fechado por causa da exceção, o conteúdo anterior ao uso do modo w é restaurado automaticamente.

Passo 7 de 8

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.

Três naturezas de falha

A etapa da operação indica o problema

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.

Onde cada falha acontece

Diagrama com três caminhos: abertura bloqueada pelo sistema de arquivos, leitura que não interpreta caracteres e escrita que não representa caracteres acentuados.

Acesso impede ou interrompe a operação no sistema de arquivos; decodificação ocorre na leitura; codificação ocorre na escrita.

Reproduza as duas falhas de codificação

Prática em arquivos descartáveis

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.

Decodificação na leitura e codificação na escrita

python
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

Como interpretar o resultado

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.

Não esconda caracteres incompatíveis

Atenção

`errors="ignore"` elimina informaçã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

Escolha pela origem ou pelo formato

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.

Classifique e escolha uma resposta segura

Associe a situação à exceção

Relacione cada situação ao tipo de falha esperado.

Toque em um item e depois no par correspondente.

Conduta segura

Uma leitura gera UnicodeDecodeError. Qual é a resposta mais adequada?

Passo 8 de 8

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.

O fluxo da aplicação

Das anotações à conferência

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.

Etapas e efeitos sobre os arquivos

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.

Fluxo em quatro etapas: criação protegida de um documento, acréscimo de uma linha, geração de um resumo numerado e bloqueio de uma nova criação sobre o documento existente.

O arquivo de anotações é preservado; somente o resumo descartável pode ser substituído a cada execução planejada.

Execute em uma pasta de teste

Atenção

Use somente arquivos descartáveis

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.

Aplicação completa

Execute este script no seu computador e observe a saída do terminal. Todos os arquivos usados por ele ficam na subpasta pratica_arquivos.

python
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

Saída esperada

A saída deverá manter os acentos e a separação entre as linhas:

Resumo gerado:
1. Revisar funções
2. Praticar arquivos
3. Conferir acentuação: ação e café

Criação repetida bloqueada: anotacoes.txt já existe.
Anotações preservadas:
Revisar funções
Praticar arquivos
Conferir 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.

Explique o resultado observado

Revisão da aplicação

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).

Síntese do tutorial

Resumo

Critérios para trabalhar com arquivos de texto

Ao lidar com texto, escolha cada opção conforme a intenção e o formato conhecido, sem ocultar falhas.

  • Use r para ler um arquivo existente, w para substituí-lo intencionalmente, a para acrescentar ao final e x para criar sem sobrescrever.
  • Informe encoding de acordo com a origem ou o formato do texto; UTF-8 é uma escolha explícita quando compatível.
  • Use read() para obter o conteúdo restante ou percorra o arquivo com for para processar uma linha de cada vez.
  • Inclua \n quando quiser separar linhas, pois write() não cria essa separação automaticamente.
  • Use with para garantir o fechamento; use try e except separadamente para tratar falhas específicas.
  • Fechar libera o recurso, mas não desfaz truncamentos nem gravações já realizadas.
  • Diferencie falhas de acesso de UnicodeDecodeError e UnicodeEncodeError, sem recorrer a perdas silenciosas de caracteres.

Tutorial concluído

Parabéns! Você concluiu: Ler e gravar arquivos de texto com with

Parabéns! Agora você pode escolher modos de abertura, trabalhar com encoding explícito e usar with para fechar arquivos de texto com segurança.

100 XP

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso