1 of 14

Arquivos em Modo Binário

2 of 14

  • São compostos por uma sequência de bytes, da mesma forma como os dados ou programas são armazenados na memória principal.

Arquivos em Modo Binário

3 of 14

Arquivos em Modo Binário

  • Orientado a bytes e não a caracteres
  • Abertura de um arquivo

objarquivo = open(nome_arquivo, modo)

Modos de Abertura:

      • b : Indica arquivo binário.
      • Combinando:
        • rb: abre arquivo binário preexistente somente para leitura.
        • wb: cria arquivo binário somente para escrita.
        • ab : abre arquivo binário para leitura/escrita no final (append).
        • rb+ : abre arquivo binário preexistente para leitura/escrita.
        • wb+ : cria arquivo binário para leitura/escrita.
  • Exemplo:

arq = open('dados.dat', 'wb')

4 of 14

Biblioteca pickle

  • Para lidar com dados binários em Python, há várias alternativas (e.g., pickle, JSON, marshal)
    • Uma das mais simples é a biblioteca pickle
  • Comando de escrita em pickle:

dump(objeto, refarquivo)

  • Escreve em refarquivo o dado armazendo em objeto.
  • Objeto pode ser um tipo primitivo ou um tipo composto (e.g., lista, dicionário, tupla, objeto)

  • Comando de leitura em pickle:

load(refarquivo)

  • Lê de refarquivo o objeto que está gravado no arquivo e retorna-o para o uso do programador.

5 of 14

Exemplo 1: uma lista

from pickle import dump, load

lista1 = [7, 40, 12, 0, -5]

print('Lista:', lista1)

arquivo = open('arquivo01.dat', 'wb')

dump(lista1, arquivo)

arquivo.close()

arquivo2 = open('arquivo01.dat', 'rb')

lista2 = load(arquivo2)

arquivo2.close()

print('Lista recuperada:', lista2)

6 of 14

Exemplo 2: duas listas em sequência

from pickle import dump, load

lista1 = [7, 40, 12, 0, -5]

lista2 = ['casa', 'carro', 'moto']

print('Lista 1:', lista1)

print('Lista 2:', lista2)

arquivo = open('arquivo02.dat', 'wb')

dump(lista1, arquivo)

dump(lista2, arquivo)

arquivo.close()

arquivo2 = open('arquivo02.dat', 'rb')

lista3 = load(arquivo2)

lista4 = load(arquivo2)

arquivo2.close()

print('Lista recuperada 1:', lista3)

print('Lista recuperada 2:', lista4)

7 of 14

Exemplo 3: dois objetos em sequência (1)

from pickle import dump, load

class Estudante:

def __init__(self,nome,matricula,anoNascimento):

self.nome = nome

self.matricula = matricula

self.anoNascimento = anoNascimento

estudante1 = Estudante('Marcos Santos',19211175, 1997)

estudante2 = Estudante('Lucas Silva',18111130, 1996)

print('Estudante 1 - Nome: %s, Matrícula: %d, Nascimento: %d' % (estudante1.nome, estudante1.matricula, estudante1.anoNascimento))

print('Estudante 2 - Nome: %s, Matrícula: %d, Nascimento: %d' % (estudante2.nome, estudante2.matricula, estudante2.anoNascimento))

# continua no slide seguinte

8 of 14

Exemplo 3: dois objetos em sequência (2)

# continuando o exemplo 3

arquivo = open('arquivo03.dat', 'wb')

dump(estudante1, arquivo)

dump(estudante2, arquivo)

arquivo.close()

arquivo2 = open('arquivo03.dat', 'rb')

estudante3 = load(arquivo2)

estudante4 = load(arquivo2)

arquivo2.close()

print('Estudante recuperado 1 - Nome: %s, Matrícula: %d, Nascimento: %d' % (estudante3.nome, estudante3.matricula, estudante3.anoNascimento))

print('Estudante recuperado 2 - Nome: %s, Matrícula: %d, Nascimento: %d' % (estudante4.nome, estudante4.matricula, estudante4.anoNascimento))

9 of 14

Exemplo 4: uma matriz 5x3

from pickle import dump, load

notas = []

for i in range(5):

linha = []

for j in range(3):

print('Para o aluno %d, digite a nota %d: '

% (i+1,j+1))

nota = float(input())

linha.append(nota)

notas.append(linha)

arquivo = open('arquivo04.dat', 'wb')

dump(notas, arquivo)

arquivo.close()

print('Arquivo salvo!')

arquivo2 = open('arquivo04.dat', 'rb')

notas2 = load(arquivo2)

arquivo2.close()

print('Arquivo carregado!')

print('\nValores lidos:\n')

for i in range(5):

for j in range(3):

print('%5.1f' % notas2[i][j], end = '')

print()

10 of 14

Exemplo 5: uma lista, elemento a elemento

from pickle import dump, load

lista1 = []

n = int(input("Digite o numero de elementos: "))

for i in range(n):

numero=int(input("Digite o elemento %d: " % (i + 1)))

lista1.append(numero)

# é possível gravar elemento a elemento da lista

arquivo = open('arquivo05.dat', 'wb')

for i in range(n):

dump(lista1[i], arquivo)

arquivo.close()

print('Arquivo salvo!')

lista2 = []

# depois, é possível ler elemento a elemento

arquivo2 = open('arquivo05.dat', 'rb')

for i in range(n):

elemento = load(arquivo2)

lista2.append(elemento)

arquivo2.close()

print('Arquivo carregado!')

print('Lista recuperada: ')

for i in range(n):

print(lista2[i])

11 of 14

Exemplo 6: recuperando uma lista cujo tamanho é desconhecido

from pickle import load

# quando não sabemos quantos elementos tem a lista,

# podemos usar EOFError – exceção disparada quando

# se chega ao final do arquivo

lista = []

arquivo = open('arquivo05.dat', 'rb')

while True:

try:

elemento = load(arquivo)

lista.append(elemento)

except EOFError:

break

arquivo.close()

print('Arquivo carregado!')

print('Lista recuperada: ')

for elemento in lista:

print(elemento)

12 of 14

Exemplo 7: uma lista de objetos

from pickle import dump, load

class Estudante:

def __init__(self,nome,matricula,anoNascimento):

self.nome = nome

self.matricula = matricula

self.anoNascimento = anoNascimento

estudantes = []

n = int(input("Digite o numero de estudantes: "))

for i in range(n):

nome = input('Nome: ')

matricula = int(input('Matrícula: '))

anoNascimento = int(input('Ano de nascimento: '))

estudante = Estudante(nome, matricula, anoNascimento)

estudantes.append(estudante)

arquivo = open('arquivo07.dat', 'wb')

dump(estudantes, arquivo)

arquivo.close()

print('Arquivo salvo!')

arquivo2 = open('arquivo07.dat', 'rb')

estudantes2 = load(arquivo2)

arquivo2.close()

print('Arquivo carregado!')

print('Lista recuperada de estudantes: ')

for estudante in estudantes2:

print('Nome: %s, Matrícula: %d, Nascimento: %d' % (estudante.nome, estudante.matricula, estudante.anoNascimento))

13 of 14

Exemplo 8a: salvando uma lista de objetos, gravando um objeto de cada vez

from pickle import dump

class Estudante:

def __init__(self,nome,matricula,anoNascimento):

self.nome = nome

self.matricula = matricula

self.anoNascimento = anoNascimento

# Se o processo de entrada de dados é lento,

# é possível salvar os estudantes um a um.

estudantes = []

n = int(input("Digite o numero de estudantes a gravar: "))

for i in range(n):

nome = input('Nome: ')

matricula = int(input('Matrícula: '))

anoNascimento = int(input('Ano de nascimento: '))

estudante = Estudante(nome, matricula, anoNascimento)

estudantes.append(estudante)

# salvando um estudante por vez

arquivo = open('arquivo08.dat', 'ab')

dump(estudante, arquivo)

arquivo.close()

print('Estudante salvo no arquivo!')

14 of 14

Exemplo 8b: lendo uma lista de objetos, carregando um objeto de cada vez

from pickle import load

class Estudante:

def __init__(self,nome,matricula,anoNascimento):

self.nome = nome

self.matricula = matricula

self.anoNascimento = anoNascimento

# Carregando os estudantes salvos em outra lista

estudantes2 = []

arquivo2 = open('arquivo08.dat', 'rb')

while True:

try:

estudante = load(arquivo2)

estudantes2.append(estudante)

except EOFError:

break

arquivo2.close()

print('Arquivo carregado!')

print('Lista recuperada de estudantes: ')

for estudante in estudantes2:

print('Nome: %s, Matrícula: %d, Nascimento: %d' %

(estudante.nome, estudante.matricula,

estudante.anoNascimento))