Na tua próxima tarefa na PyTalento, vais aprender a trabalhar com ficheiros binários. Embora os ficheiros de texto sejam muito utilizados, há situações em que precisas de lidar com ficheiros binários, que armazenam dados em formato binário (números, bytes, etc.). Este subcapítulo vai ensinar-te a abrir, ler e escrever ficheiros binários em Python.
Objetivos
- Compreender a diferença entre ficheiros de texto e ficheiros binários.
- Aprender a ler e escrever ficheiros binários em Python.
- Explorar exemplos práticos de manipulação de ficheiros binários.
O que são Ficheiros Binários?
Os ficheiros binários armazenam dados no formato binário (uns e zeros) e são normalmente utilizados para representar dados que não podem ser lidos diretamente como texto, como números inteiros, dados estruturados, ou formatos comprimidos. Ao contrário dos ficheiros de texto, que armazenam caracteres legíveis, os ficheiros binários armazenam dados em formatos diretamente compreensíveis pelos sistemas computacionais.
Diferença entre Ficheiros de Texto e Ficheiros Binários:
- Ficheiros de Texto: Contêm caracteres legíveis (como letras, números e símbolos).
- Ficheiros Binários: Contêm dados em formato binário (bytes) que podem representar qualquer tipo de dado.
Abrir e Fechar Ficheiros Binários
Usamos a função open() para abrir ficheiros binários, da mesma forma que fazemos com ficheiros de texto, mas especificamos que queremos abrir o ficheiro em modo binário, utilizando rb (leitura binária) ou wb (escrita binária).
Exemplo de Abertura de um Ficheiro Binário:
# Abrir um ficheiro binário para leitura
with open("numeros.bin", "rb") as ficheiro:
conteudo = ficheiro.read()
# Abrir um ficheiro binário para escrita
with open("numeros_copia.bin", "wb") as ficheiro:
ficheiro.write(conteudo)
No exemplo acima, abrimos um ficheiro binário que contém números em formato binário e copiamos o seu conteúdo para outro ficheiro.
Gravar e Ler Números Inteiros como Binários
Um uso prático de ficheiros binários é armazenar dados numéricos, como listas de números inteiros. Para isso, usamos o módulo struct para converter números inteiros em bytes, que podem ser gravados num ficheiro binário.
Exemplo de Gravação de Números Inteiros num Ficheiro Binário:
import struct
# Lista de números inteiros
numeros = [10, 20, 30, 40, 50]
# Abrir um ficheiro binário para escrita
with open("numeros.bin", "wb") as ficheiro:
for numero in numeros:
ficheiro.write(struct.pack('i', numero)) # 'i' representa inteiro
Neste exemplo, a função struct.pack('i', numero) converte cada número inteiro num formato binário (4 bytes). Em seguida, esses bytes são gravados no ficheiro numeros.bin.
Exemplo de Leitura de Números Inteiros a partir de um Ficheiro Binário:
import struct
# Abrir o ficheiro binário para leitura
with open("numeros.bin", "rb") as ficheiro:
numeros_lidos = []
while chunk := ficheiro.read(4): # Ler 4 bytes de cada vez
numeros_lidos.append(struct.unpack('i', chunk)[0])
print("Números lidos:", numeros_lidos)
No exemplo acima, usamos struct.unpack('i', chunk) para converter os bytes de volta para números inteiros. O valor 4 indica que estamos a ler 4 bytes de cada vez (tamanho de um inteiro).
Exemplo Prático: Guardar e Ler uma Lista de Números Inteiros
Um caso prático comum é guardar listas de números inteiros em ficheiros binários para armazenamento eficiente. Aqui está um exemplo que mostra como gravar e depois ler esses números de volta a partir de um ficheiro binário.
Exemplo de Código Completo:
import struct
# Lista de números inteiros
numeros = [5, 10, 15, 20, 25]
# Guardar os números num ficheiro binário
with open("numeros.bin", "wb") as ficheiro:
for numero in numeros:
ficheiro.write(struct.pack('i', numero))
# Ler os números de volta do ficheiro binário
numeros_lidos = []
with open("numeros.bin", "rb") as ficheiro:
while chunk := ficheiro.read(4):
numeros_lidos.append(struct.unpack('i', chunk)[0])
print("Números lidos do ficheiro binário:", numeros_lidos)
Este código guarda uma lista de números inteiros num ficheiro binário e depois lê-os de volta, garantindo que os dados são armazenados e recuperados corretamente.
Exercício Prático
A empresa PyTalento pediu-te que desenvolvas um programa que grave uma lista de números inteiros fornecida pelo utilizador num ficheiro binário e depois os leia de volta. O programa deve seguir os seguintes passos:
Requisitos:
- Pede ao utilizador para introduzir uma lista de números inteiros.
- Guarda esses números num ficheiro binário.
- Lê o conteúdo do ficheiro binário e imprime a lista de números.
Exemplo de Código:
import struct
# Pede ao utilizador uma lista de números inteiros
numeros = []
for i in range(5):
numero = int(input("Introduz um número inteiro: "))
numeros.append(numero)
# Guardar os números no ficheiro binário
with open("numeros.bin", "wb") as ficheiro:
for numero in numeros:
ficheiro.write(struct.pack('i', numero))
# Ler os números do ficheiro binário
numeros_lidos = []
with open("numeros.bin", "rb") as ficheiro:
while chunk := ficheiro.read(4):
numeros_lidos.append(struct.unpack('i', chunk)[0])
print("Números lidos do ficheiro:", numeros_lidos)