Você está na página 1de 5

Arquivos binrios em Python

Vamos comear analisando uma estrutura.

Cdigo (Python):
try:
arquivo = open("arquivo.exe","rb")
print "Arquivo aberto!"
arquivo.close()
except IOError:
print "Erro ao abrir o arquivo"

Antes de tudo, o modo rb tenta abrir um arquivo como binrio para leitura. Reveja a tabela:
Parmetro
Ao
rb
Abre um arquivo binrio especificado para leitura. O arquivo deve existir previamente.
wb
Abre um arquivo binrio especificado para escrita. Caso o arquivo no exista, este ser criado,
porm , caso exista, seus dados sero sobrescritos.
r+b
Abre um arquivo binrio especificado para leitura e escrita. O arquivo deve existir previamente,
podendo ser alterado.
w+b
Abre um arquivo binrio especificado para escrita e leitura. Caso o arquivo no exista ser
criado, caso exista, seus dados sero sobrescritos.
a+b
Abre um arquivo binrio especificado no modo Append. Caso o arquivo no exista, ser criado,
caso exista, os dados sero acrescentados aps a sua ltima linha, no sobrescrevendo-o.
Na estrutura acima, utilizamos dois mtodos: try e except. O mtodo try, como a sua prpria traduo sugere
(tentar), tenta executar uma ou mais aes que podem no ser executadas com sucesso. O mtodo except,
utilizado justamente para validar os possveis erros que impediram as instrues especificadas por try de serem
finalizadas com xito.
Utilizamos IOError para validar erros de entrada/sada, consequentemente, a manipulao de arquivos. Voltando
estrutura, o programa tenta abrir o arquivo, e em caso de erro, retornada uma mensagem de erro.
Para fecharmos um arquivo, utilizamos: arquivo.close().

Lendo arquivos binrios


Abaixo temos um exemplo de como retornar o tamanho de um arquivo:

try:
arquivo = open("arquivo.exe","rb")
except IOError:
print "Erro ao abrir o arquivo"
arquivo.seek(0,2)
tamanho = arquivo.tell()
print "O tamanho do arquivo e:",tamanho
arquivo.close()

Veja:
arquivo.seek(0,2) => A funo arquivo.seek() utilizada para alterar a posio read/write do cdigo de um
arquivo.
A sintaxe da funo : arquivo.seek(bloco,[origem])
bloco => Nmero de bytes para o qual a posio read/write ser alterada a partir da origem.
origem => Define a posio de onde o bloco de bytes ser contado.

Embora
Valor
0
1
2

seja opcional especificar a origem, para esta, temos:


Posio
Incio do arquivo
Posio atual
Final do Arquivo

Portanto, no trecho: arquivo.seek(0,2); estamos alterando a posio read/write exatamente para o final do
arquivo. E como j sabemos, a ltima posio de leitura/escrita em um arquivo, indica o tamanho do arquivo em
bytes.
tamanho = arquivo.tell() => Atribuimos varivel tamanho, o valor de retorno da funo arquivo.tell() que
retorna a posio atual de leitura/escrita no arquivo.
Considere o cdigo:
# Exemplo: Lendo um arquivo inteiro.

try:
arquivo = open("arquivo.exe","rb")
except IOError:
print "Erro ao abrir o arquivo"
arquivo.seek(0,2)
tamanho = arquivo.tell()
arquivo.seek(0)
buffer = arquivo.read(tamanho)
arquivo.close()
Analisando:
arquivo.seek(0) => Retorna a posio read/write ao incio, para podermos ler o arquivo desde o incio.
buffer = arquivo.read(tamanho) => Amarzena em um buffer todo o contedo do arquivo.
A sintaxe da funo : buffer arquivo.read(tamanho)
buffer => Buffer no qual o contedo ser lido.
tamanho => Tamanho em bytes do bloco a ser lido.
Considere agora o cdigo que l o arquivo por partes:

#Exemplo: lendo um arquivo por partes

try:
arquivo = open("arquivo.exe","rb")
except IOError:
print "Erro ao abrir o arquivo"
arquivo.seek(0,2)
tamanho = arquivo.tell()
arquivo.seek(0)
chunk = 1024
while arquivo.tell() < tamanho:
buffer = arquivo.read(chunk)
print "Posicao:",arquivo.tell()," - Total:",tamanho
arquivo.close()
Destacando:
chunk = 1024 => Atribuimos a uma varivel denominada chunk o valor 1024, que representa o nmero de bytes
a serem lidos por vez.
while arquivo.tell() < tamanho: => Enquanto a posio read/write no for a ltima.
buffer = arquivo.read(chunk) => L no arquivo,o tamanho especificado pelo chunk, no caso, 1024 bytes.
print "Posicao:",arquivo.tell()," - Total:",tamanho => Mostra a posio read/write atual do arquivo e o tamanho
do arquivo, a cada loop.
Em Python, o tamanho disponvel para ser lido (diferena entre posio read/write final e posio read/write atual)
automaticamente calculado.

Escrevendo em arquivos binrios


Veremos agora como escrever em arquivos binrios:
# Exemplo: escrevendo em um arquivo

Cdigo (Python):
try:
arquivo = open("arquivo.exe","wb")
except IOError:
print "Erro ao abrir o arquivo"
arquivo.write("hi")
arquivo.close()
Explicando:
arquivo = open("arquivo.exe","wb") => Utilizamos o modo wb ao invs de rb;
arquivo.write("hi") => A funo arquivo.write() a funo inversa arquivo.read(). Enquanto a ltima ler
dados, arquivo.write() escreve.

Sintaxe: arquivo.write(buffer)
buffer => Buffer que contm os dados a serem escritos.

Considere o cdigo que l um arquivo por inteiro em seguida escreve um arquivo com os dados lidos:
# Exemplo: lendo e escrevendo em um arquivo inteiro;

Cdigo (Python):
try:
arquivo = open("arquivo.exe","rb")
destino = open("copia.exe","wb")
except IOError: #Erro ao abrir algum dos arquivos
print "Erro ao abrir o arquivo"
arquivo.seek(0,2)
tamanho = arquivo.tell()
arquivo.seek(0)
buffer = arquivo.read(tamanho)
destino.write(buffer)
arquivo.close()
destino.close()
Pontos em destaque:
arquivo = open("arquivo.exe","rb") => Abre o arquivo de origem para leitura.
destino = open("copia.exe","wb") => Abre o arquivo de destino para escrita.
buffer = arquivo.read(tamanho) => L o contedo do arquivo de origem.
destino.write(buffer) => Escreve no arquivo de destino o contedo lido.
arquivo.close()
destino.close()
Fecha os arquivos.
Abaixo, segue o cdigo que como realizar tal processo, porm lendo e escrevendo um arquivo por partes.
# Exemplo: lendo e escrevendo em um arquivo inteiro;

Cdigo (Python):

try:
arquivo = open("arquivo.exe","rb")
destino = open("copia.exe","wb")
except IOError:
print "Erro ao abrir o arquivo"

arquivo.seek(0,2)
tamanho = arquivo.tell()

arquivo.seek(0)
chunk = 1024
while arquivo.tell() < tamanho:
buffer = arquivo.read(chunk)
destino.write(buffer)
arquivo.close()
destino.close()
Acima notamos que a cada loop o programa tenta ler 1024 bytes do arquivo ou ento l a quantidade total
disponvel, em seguida, escreve esses bytes no arquivo de destino.