Módulo 8 - Arquivos CSV e pathlib
Context managers: o with a fundo
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Entender o que o with faz ao abrir e fechar um recurso.
- Ver por que o with fecha o arquivo mesmo se ocorrer um erro.
- Comparar abrir com with contra open e close na mão.
- Reconhecer o context manager como um padrão além de 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: Context managers: o with a fundo.
Os objetivos desta aula. Entender o que o with faz ao abrir e fechar um recurso. Ver por que o with fecha o arquivo mesmo se ocorrer um erro. Comparar abrir com with contra open e close na mão. Reconhecer o context manager como um padrão além de arquivos.
Veja o essencial, parte por parte.
O que o with realmente faz. O with abre um recurso no começo do bloco e o fecha automaticamente no fim.
O ponto crucial: erro no meio do bloco. O verdadeiro valor do with aparece quando algo dá errado.
Context managers além de arquivos. Sempre que abrir um arquivo, para ler ou gravar, inclusive CSV.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
O que o with realmente faz
Você já escreveu with open(...) as arquivo dezenas de vezes neste módulo. Agora vamos abrir a caixa. Quando você entra no bloco with, o Python chama uma preparação: no caso de um arquivo, ele o abre e entrega para a variável depois do as. Quando o bloco termina, por qualquer motivo, o Python chama uma finalização: para um arquivo, ele o fecha. Esse par de entrar e sair, com garantia de finalização, é o que se chama de context manager. O arquivo é um deles, e por isso o with combina tão bem com ele.
# Com with: o arquivo fecha sozinho ao sair do bloco
with open("dados.txt", encoding="utf-8") as arquivo:
conteudo = arquivo.read()
print(len(conteudo))
# aqui, fora do bloco, o arquivo ja esta fechado
print(arquivo.closed) # TrueAo sair do bloco with, o arquivo já está fechado, sem chamar close na mão.
Repare que, depois do bloco, arquivo.closed é True: o fechamento aconteceu sem você pedir. Isso parece um detalhe pequeno com um arquivo só, mas é uma rede de segurança poderosa. Deixar arquivos abertos pode travar a edição por outros programas, deixar gravações pela metade e, em programas que abrem muitos arquivos, esgotar o limite do sistema. O with elimina toda uma categoria de bugs esquecidos, porque o fechamento deixa de depender da sua memória.
O ponto crucial: erro no meio do bloco
O verdadeiro valor do with aparece quando algo dá errado. Imagine abrir um arquivo, começar a processar e, no meio, uma linha inválida estourar um erro. Sem o with, se o seu close estivesse depois do processamento, ele nunca seria alcançado: o erro pularia direto para fora, deixando o arquivo aberto. Com o with, o Python fecha o arquivo mesmo assim, no caminho de saída pelo erro, antes de o erro seguir subindo. Você ganha o fechamento sem escrever nenhuma linha extra.
Sem with (open e close na mão)
- Você precisa lembrar de chamar close
- Um erro no meio pula o close
- Para ficar seguro, exige try e finally
- Mais linhas e mais chance de esquecer
Com with
- O fechamento é automático
- Fecha mesmo se um erro ocorrer
- O próprio with cuida do finally por você
- Menos linhas e mais seguro
# O que o with faz por voce, por baixo dos panos:
arquivo = open("dados.txt", encoding="utf-8")
try:
conteudo = arquivo.read()
# se der erro aqui, o finally ainda roda
finally:
arquivo.close() # sempre executa, com erro ou sem erro
print(arquivo.closed) # TrueO with equivale a este try/finally: o fechamento acontece de qualquer jeito.
Esse código mostra o que o with faz por baixo dos panos: ele equivale a um try com finally, em que o finally sempre roda, com erro ou sem erro, garantindo o close. A diferença é que o with expressa isso em uma linha limpa, sem você repetir o try/finally toda vez. É a versão pythônica: mais curta, mais legível e sem a chance de esquecer o fechamento. Por isso a documentação e a comunidade recomendam abrir arquivos sempre com with.
Context managers além de arquivos
O padrão do with não vale só para arquivos. Qualquer recurso que precise ser preparado e depois liberado combina com ele: conexões de rede, travas entre partes de um programa, conexões de banco de dados. Todos podem ser context managers, entrando com uma preparação e saindo com uma limpeza garantida. Você vai encontrar esse padrão em muitas bibliotecas. Por ora, o importante é entender a ideia: with é para recursos que se abrem e se fecham, e ele garante o fechamento.
import csv
# Ler de um arquivo e gravar em outro, os dois no mesmo with
with open("entrada.csv", newline="", encoding="utf-8") as ent, \
open("saida.csv", "w", newline="", encoding="utf-8-sig") as sai:
leitor = csv.reader(ent)
escritor = csv.writer(sai)
for linha in leitor:
escritor.writerow(linha)
print("Copiado com os dois arquivos fechados no fim.")Um único with pode gerenciar dois arquivos; ambos fecham ao sair do bloco.
Teste rápido
Por que o with é preferido a chamar close na mão ao trabalhar com arquivos?
Perguntas frequentes
- O with serve só para abrir arquivos?
- Não. Arquivos são o uso mais comum, mas o with funciona com qualquer context manager: conexões de rede, travas, conexões de banco de dados e outros recursos que precisam ser liberados no fim. A ideia é sempre a mesma: entrar preparando e sair liberando com garantia.
- O que acontece se der um erro dentro do bloco with?
- O arquivo é fechado mesmo assim, no caminho de saída pelo erro, antes de o erro continuar subindo. É a maior vantagem do with: o fechamento não depende de o bloco terminar com sucesso, o que evita arquivos abertos e gravações pela metade.
- Posso abrir dois arquivos no mesmo with?
- Sim. Basta separá-los por vírgula no mesmo with, como with open(a) as x, open(b) as y. Os dois são fechados ao sair do bloco. Isso é útil no padrão de ler de um arquivo e gravar em outro, comum no processamento de CSV.
- O with substitui o try e except?
- Não, eles resolvem coisas diferentes. O with garante a liberação de um recurso, equivalendo a um try/finally. O try/except trata o erro em si, decidindo o que fazer quando ele ocorre. Você pode usar os dois juntos: um with para o arquivo e um try/except para tratar linhas inválidas.
- Se eu esquecer o with, o arquivo fica aberto para sempre?
- Não necessariamente para sempre, mas por tempo indeterminado. O Python pode fechar o arquivo mais tarde, quando limpa a memória, mas você não controla quando. Isso pode travar outros programas, deixar gravações incompletas e, em escala, esgotar os arquivos que o sistema permite abrir. Por isso, use with.
- Por que dizem que with é o jeito pythônico de abrir arquivos?
- Porque ele expressa em uma linha limpa o que exigiria um try/finally repetitivo, garantindo o fechamento sem chance de esquecer. É mais curto, mais legível e mais seguro, exatamente o que a comunidade Python considera idiomático. A documentação oficial recomenda abrir arquivos com with.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.