Gerenciador de contexto (with)

O bloco with é uma estrutura de controle em Python que é construída para gerenciar recursos automaticamente (como abrir e fechar arquivos, conexões de banco de dados, etc.). Ele garante que, ao sair do bloco, o recurso será liberado corretamente (fechado, desconectado, etc.), mesmo que uma exceção seja levantada.

O with usa o protocolo de contexto do Python, com os métodos especiais:

  • __enter__: Executado ao entrar no bloco with.
  • __exit__: Executado ao sair do bloco, independentemente de sucesso ou erro.
pasta_temp_with.py
import tempfile

with tempfile.TemporaryDirectory() as pasta_temporaria:

    # Define o caminho completo para o arquivo dentro da pasta temporária
    caminho_arquivo = os.path.join(pasta_temporaria, "notas.txt")

    with open(caminho_arquivo, 'w') as arquivo:
        for i in range(10):
            arquivo.write(f"texto {i} na pasta temporária\n")

    # Imprime o caminho da pasta temporária
    print(pasta_temporaria)

     # Apenas para ver a pasta temporária antes que ela se encerre
    input()

Cria uma pasta temporária que so existe dentro desse escopo do with e exclui em seguida.


Manipulação de arquivos

Python pode ler e escrever arquivos. Ao abrir um arquivo (que é um iteravel e iterador) ele cria um objeto com um cursor que consome esse arquivo linha por linha, sendo lazy (não carrega todo o conteúdo do arquivo de uma vez para a memória - a não ser que o transforme em lista).

Métodos Comuns de Arquivos

Depois de abrir um arquivo com open(), você pode usar métodos no objeto retornado para interagir com ele:

Método Descrição
read() Lê o conteúdo inteiro do arquivo como uma string.
read(size) size bytes ou caracteres do arquivo.
readline() Lê uma única linha do arquivo.
readlines() Lê todas as linhas e retorna uma lista.
write(string) Escreve a string no arquivo.
writelines(lines) Escreve uma sequência de strings (linhas).
close() Fecha o arquivo. (Automático ao usar with)
seek(offset) Move o ponteiro do arquivo para o deslocamento especificado.
tell() Retorna a posição atual do ponteiro do arquivo.

 

Modos mais comuns de abertura de Arquivos
Modo Descrição
'r' Leitura. Arquivo deve existir.
'w' Escrita. Cria/Trunca (apaga conteúdo).
'x' Escrita. Cria. Erro se arquivo já existe.
'a' Escrita. Adiciona ao final (append).
'b' Binário (usado junto com outros modos).
't' Texto (padrão, usado com outros modos).
'+' Leitura e escrita.

Exemplos:

  • 'rb': Leitura em modo binário.
  • 'a+': Adicionar conteúdo e permitir leitura.

 

No modo w (modo de escrita), se o arquivo já existir, ele será sobrescrito, ou seja, o conteúdo anterior será apagado. Se o arquivo não existir, ele será criado automaticamente.

arquivo.py
# Abre o arquivo em mode escrita
arquivo = open("notas.txt", 'w')

arquivo.write("Anotação especial - feita por Python\n")
arquivo.write("Segunda linha")

# Fecha o arquivo e salva as modificações
arquivo.close()

Usar o with ao trabalhar com arquivos em Python é uma boa prática porque ele gerencia automaticamente o fechamento do arquivo, mesmo que ocorra algum erro durante a operação. A estrutura with cria um contexto gerenciado para a operação com o arquivo, o que elimina a necessidade de chamar explicitamente arquivo.close().

arquivo_with.py
# Abre um arquivo no modo escrita
with open("notas.txt", 'w') as arquivo:
    arquivo.write("Anotação especial - feita por Python num bloco with\n")

# Abre um arquivo no modo de leitura ('r' - read)
with open("notas.txt", "r") as arquivo:
    conteudo = arquivo.read()
    print(conteudo)
compactar_arquivos_zipFile_glob.py
import zipfile
import glob

with zipfile.ZipFile('data.zip', 'w') as zip:
    # retorna todos arquivos .csv dentro da pasta atual
    for file in glob.glob("*.csv"):
        zip.write(file) # compacta cada arquivo para dentro do data.zip

O módulo glob é usado para encontrar arquivos e pastas com base em padrões de nomes, como *.txt, *.csv, *.py, etc. Esse exemplo serve para compactar arquivos de extensão csv usando o glob e o zipfile.