Arquivos Binários em Python
Diferentemente dos arquivos de texto, os arquivos binários armazenam informações como um conjunto de bytes. Para abrir um arquivo binário para leitura ou escrita, é necessário utilizar o modo "b"
junto com o modo de leitura "r"
ou gravação "w"
.
Na leitura, obtemos o conteúdo do arquivo como um conjunto de bytes, enquanto na escrita, o método write()
recebe um conjunto de bytes como entrada. Abaixo está um exemplo de como copiar um arquivo binário:
FILENAME = "forest.png" # nome do arquivo de leitura
NEWFILENAME = "forest_new.png" # nome do arquivo de gravação
# Lê o arquivo e armazena os dados em image_data
with open(FILENAME, "rb") as file:
image_data = file.read()
# Grava os bytes lidos em um novo arquivo
with open(NEWFILENAME, "wb") as file:
file.write(image_data)
print(f"Arquivo {FILENAME} copiado para {NEWFILENAME}")
Neste código, o arquivo localizado no caminho especificado por FILENAME
(neste caso, a imagem "forest.png"
) é lido em formato binário, e os bytes resultantes são armazenados na variável image_data
. Em seguida, esses bytes são escritos em um novo arquivo, especificado por NEWFILENAME
, copiando assim o conteúdo de um arquivo para outro.
Módulo pickle
O Python também oferece o módulo embutido pickle
para facilitar o trabalho com arquivos binários. Esse módulo simplifica o armazenamento e a recuperação de objetos Python em arquivos binários. Ele fornece dois métodos principais:
dump(obj, file)
: grava o objetoobj
em um arquivo bináriofile
.load(file)
: lê dados de um arquivo binário e os converte de volta para um objeto Python.
Abaixo está um exemplo de como salvar os valores de duas variáveis em um arquivo binário:
import pickle
FILENAME = "user.dat"
name = "Tom"
age = 19
# Grava os objetos name e age em um arquivo binário
with open(FILENAME, "wb") as file:
pickle.dump(name, file)
pickle.dump(age, file)
# Lê os objetos do arquivo binário
with open(FILENAME, "rb") as file:
name = pickle.load(file)
age = pickle.load(file)
print("Nome:", name, "\nIdade:", age)
A função dump
grava os dois objetos em sequência no arquivo. Ao ler o arquivo, podemos recuperar esses objetos na mesma ordem usando a função load
. O resultado exibido no console será:
Nome: Tom Idade: 19
Agora, veja como podemos armazenar e ler uma lista de objetos:
import pickle
FILENAME = "users.dat"
users = [
["Tom", 28, True],
["Alice", 23, False],
["Bob", 34, False]
]
# Grava a lista de usuários em um arquivo binário
with open(FILENAME, "wb") as file:
pickle.dump(users, file)
# Lê a lista de usuários do arquivo binário
with open(FILENAME, "rb") as file:
users_from_file = pickle.load(file)
for user in users_from_file:
print(user)
De acordo com o objeto que foi gravado usando a função dump
, o mesmo será retornado pela função load
ao ler o arquivo.
O resultado exibido no console será:
["Tom", 28, True] ["Alice", 23, False] ["Bob", 34, False]
Dessa forma, o módulo pickle
permite a fácil gravação e leitura de conjuntos complexos de dados em arquivos binários, preservando a estrutura dos objetos originais.
Documentação oficial: