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 blocowith.__exit__: Executado ao sair do bloco, independentemente de sucesso ou erro.
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) |
Lê 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.
# 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().
# 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)
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.