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.

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)  # True

Ao 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)  # True

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