Trilha de aprendizado · Nível 6 · Tutorial 5

Ler e gravar arquivos binários

Preservar o conteúdo de arquivos binários e realizar conversões explícitas entre texto e bytes somente quando houver uma codificação conhecida.

  • Nível: Intermediário
  • Duração: 16 min
  • 6 passos
Ler e gravar arquivos binários

Passo 1 de 6

Diferenciar texto de bytes

Reconheça quando um valor representa texto e quando representa bytes que devem ser preservados sem interpretação automática.

Duas representações diferentes

Texto não é o mesmo que bytes

Em Python, str representa texto Unicode: uma sequência de caracteres destinada à interpretação como texto. Já bytes representa uma sequência imutável de valores inteiros entre 0 e 255.

Embora ambos possam aparecer como sequências, eles têm significados diferentes. Um valor bytes não deve ser tratado automaticamente como texto.

Caracteres e valores de bytes

Compare as duas estruturas: à esquerda, cada posição contém um caractere; à direita, cada posição contém um valor de byte.

Comparação lado a lado entre uma sequência de caracteres e uma sequência de posições com valores numéricos de bytes.

Uma sequência de caracteres representa texto; uma sequência de bytes preserva valores entre 0 e 255.

O arquivo não define sua interpretação

Primeiro existem bytes

No armazenamento, arquivos contêm bytes. Considerar esses bytes como texto exige uma interpretação adicional; isso não é uma propriedade automática do conteúdo.

Quando você sabe que um arquivo contém texto, pode tratá-lo como texto. Quando a tarefa é preservar o conteúdo original — como ao copiar uma imagem — o modo binário evita interpretar os dados como caracteres.

Exemplo

Escolha conforme a intenção

  • Uma mensagem que será lida e editada como palavras: trabalhe com texto (str).
  • Os dados de uma imagem que serão copiados sem alteração: preserve os bytes.
  • Um conteúdo cujo formato textual não é conhecido: não presuma que seus bytes formam texto.

Dica

Pergunta útil

Antes de abrir um arquivo, pergunte: “Preciso interpretar este conteúdo como texto ou apenas preservar seus bytes?” A resposta orienta a escolha entre tratamento textual e binário.

Classifique a intenção

Texto ou preservação binária?

Associe cada situação à decisão mais adequada.

Toque em um item e depois no par correspondente.

Passo 2 de 6

Criar e acessar sequências de bytes

Interprete literais bytes e descubra como índices, fatias e tentativas de alteração se comportam.

Literais bytes e escapes

Como escrever uma sequência de bytes

O prefixo b cria um literal do tipo bytes. Caracteres ASCII podem aparecer diretamente, enquanto valores não imprimíveis ou fora do ASCII podem ser representados por escapes hexadecimais \xNN.

Em b"ABC\x00\xff", cada parte representa um byte. Os escapes \x00 e \xff representam, respectivamente, os valores 0 e 255. Cada escape hexadecimal desse formato possui dois dígitos.

Examine o literal

Execute no interpretador ou em um script local:

python
dados = b"ABC\x00\xff"

print(dados)
print(type(dados))
print(len(dados))

# Saída:
# b'ABC\x00\xff'
# <class 'bytes'>
# 5

Índice, fatia e imutabilidade

Um índice devolve um número; uma fatia devolve bytes

A indexação de bytes produz um int entre 0 e 255. Já o fatiamento produz outro valor bytes, mesmo quando a fatia contém apenas um elemento.

A forma impressa pode mostrar alguns bytes como caracteres e outros como escapes. Isso é apenas uma representação conveniente da sequência — não é uma decodificação textual.

Duas formas de acesso

Diagrama de uma sequência com cinco bytes, relacionando posições individuais a valores inteiros e intervalos a novas sequências de bytes.

Selecionar uma posição produz um inteiro; selecionar um intervalo produz bytes.

Compare os resultados

Observe também que a sequência é imutável: a última linha provoca TypeError.

python
dados = b"ABC\x00\xff"

print(dados[0])      # 65, do tipo int
print(dados[3])      # 0, do tipo int
print(dados[-1])     # 255, do tipo int
print(dados[1:3])    # b'BC', do tipo bytes
print(dados[0:1])    # b'A', do tipo bytes

# Inválido: objetos bytes não aceitam substituição por posição
dados[0] = 90        # TypeError

Preveja os acessos

Resultado da indexação

Considere dados = b"ABC\x00\xff". Qual é o resultado de dados[3]?

Tipo da fatia

Qual é o nome do tipo produzido por dados[4:5]?

É possível alterar uma posição?

Verifique a imutabilidade

Para dados = b"ABC", a instrução dados[0] = 90 altera o primeiro byte para o valor 90.

Passo 3 de 6

Gravar bytes em um arquivo

Use o modo wb para gravar uma sequência de bytes exatamente como ela está na memória, sem codificação textual.

O que o modo wb faz

Gravação binária

O modo wb abre um arquivo para gravação binária. Nesse modo, write exige um valor bytes: fornecer uma str provoca TypeError.

Os bytes são gravados sem codificação textual e sem tradução de quebras de linha. Por isso, não use o parâmetro encoding: ele é incompatível com o modo binário.

Da memória para o arquivo

O mesmo conjunto de valores segue da sequência em memória para o arquivo, sem uma etapa de interpretação textual.

Diagrama de blocos de bytes saindo da memória, passando por uma operação de gravação em modo wb e chegando inalterados a um arquivo.

Em wb, write recebe bytes e os envia ao arquivo sem codificação ou tradução de quebras de linha.

Atenção

wb pode apagar o conteúdo anterior

Se o destino não existir, wb o cria. Se já existir, o arquivo é truncado assim que a abertura é concluída com sucesso, antes mesmo da chamada a write. Pratique somente com um caminho descartável e confira o destino antes de executar o código.

Prática no seu computador

Grave uma pequena amostra

Crie um script no seu editor e execute o código abaixo. Ele cria a pasta pratica_binaria na pasta de trabalho e grava uma amostra de 7 bytes em amostra.bin. O resultado esperado no terminal é uma mensagem informando que 7 bytes foram gravados.

A amostra contém letras ASCII, dois valores de quebra de linha e bytes que não precisam representar texto. A leitura e a conferência do arquivo serão feitas no próximo step.

Código completo

Execute este script em uma pasta onde seja seguro criar arquivos de prática.

python
from pathlib import Path

pasta = Path("pratica_binaria")
pasta.mkdir(exist_ok=True)

destino = pasta / "amostra.bin"
amostra = b"BIN\r\n\x00\xff"

with open(destino, "wb") as arquivo:
    quantidade = arquivo.write(amostra)

print(f"{quantidade} bytes gravados em {destino}")

Dica

Observe a ausência de encoding

A abertura usa somente o caminho e "wb". Acrescentar encoding="utf-8", por exemplo, causa ValueError, pois uma codificação textual não se aplica a um arquivo aberto em modo binário.

Escolha os elementos corretos

Complete o modo

Complete a abertura para gravar dados binários, sem informar encoding:

with open(destino, "____") as arquivo:

Complete a escrita

Considerando amostra = b"BIN\r\n\x00\xff", complete a chamada:

arquivo.write(____)

Proteja o destino

Você percebeu que destino aponta para um arquivo importante que já existe. O que deve fazer antes de executar o script?

Passo 4 de 6

Ler e conferir o conteúdo binário

Leia uma pequena amostra com rb, inspecione os bytes retornados e confirme o conteúdo por igualdade integral.

Do arquivo para a memória

read() retorna bytes em modo binário

Ao abrir um arquivo com rb, read() devolve um valor do tipo bytes, não str. Nenhuma interpretação como texto é aplicada.

Neste tutorial, a leitura integral com read() será usada apenas em arquivos pequenos. Depois da leitura, você pode inspecionar o resultado com type, len, índices e fatias.

Correspondência dos bytes

O modo rb transporta para a memória a mesma sequência de valores armazenada no arquivo. Isso inclui bytes como 0, 255 e o valor que poderia representar uma quebra de linha em um texto.

Diagrama de um arquivo com oito células de bytes ligado por uma seta a uma sequência idêntica de oito células na memória.

Cada posição lida corresponde ao mesmo byte do arquivo; nenhuma conversão textual acontece.

Leia e inspecione a amostra

Prática local

Execute o código no seu computador. Ele considera a amostra do step anterior no caminho pratica_binaria/amostra.bin, cujo conteúdo de referência é b"BIN\x00\xff\nOK".

Se você usou outro caminho anteriormente, ajuste somente o valor de caminho.

Leitura e conferência integral

Salve como um script Python ou execute no ambiente local em que criou a amostra.

python
from pathlib import Path

caminho = Path("pratica_binaria") / "amostra.bin"
esperado = b"BIN\x00\xff\nOK"

with open(caminho, "rb") as arquivo:
    dados = arquivo.read()

print("Valor:", dados)
print("Tipo:", type(dados))
print("Comprimento:", len(dados))
print("Primeiro byte:", dados[0])
print("Fatia:", dados[3:6])
print("Mesmo tamanho:", len(dados) == len(esperado))
print("Mesmo conteúdo:", dados == esperado)

Dica

O que observar

Para a amostra indicada, você deve obter o tipo bytes, comprimento 8, primeiro byte 66, fatia b'\x00\xff\n' e igualdade de conteúdo igual a True. A fatia continua sendo bytes, mesmo contendo apenas parte da sequência.

Tamanho igual não basta

Interprete sua verificação

Depois de executar o código, qual foi o tipo retornado por read() e qual foi o resultado de dados == esperado? Explique também por que a igualdade dos bytes é uma verificação mais forte do que comparar apenas os comprimentos.

Escreva pelo menos 80 caracteres (0/80).

Passo 5 de 6

Converter entre texto e bytes

Faça conversões explícitas com UTF-8, compare caracteres e bytes e reconheça quando dados binários não devem ser decodificados.

Conversões têm direção

De texto para bytes — e de volta

Use encode quando você tem uma str e precisa produzir bytes. Use decode quando você tem bytes que representam texto e precisa obter uma str.

dados = texto.encode("utf-8")
texto = dados.decode("utf-8")

A codificação deve ser conhecida e informada na conversão. Ao trabalhar com um arquivo aberto em rb ou wb, não passe encoding para open: a conversão ocorre separadamente, com encode ou decode.

Um caractere pode corresponder a mais de um byte

Em UTF-8, os quatro caracteres de ação são representados por seis bytes. Os bytes de ç e ã formam grupos de dois.

Diagrama de ida e volta entre a string ação, com quatro caracteres, e seis bytes UTF-8 agrupados por caractere.

encode("utf-8") segue de str para bytes; decode("utf-8") percorre o caminho inverso.

Observe a ida e a volta

Conversão completa em memória

Execute este código no seu ambiente Python e compare os tipos e comprimentos apresentados.

python
texto = "ação"
dados = texto.encode("utf-8")
recuperado = dados.decode("utf-8")

print(type(texto), len(texto))
print(type(dados), len(dados), dados)
print(recuperado)
print(recuperado == texto)

Exemplo

Resultado esperado

<class 'str'> 4
<class 'bytes'> 6 b'a\xc3\xa7\xc3\xa3o'
ação
True

len(texto) conta quatro caracteres. len(dados) conta seis bytes. A igualdade final confirma que a conversão de ida e volta com a mesma codificação recuperou o texto deste exemplo.

Atenção

Nem todo conteúdo binário é texto

Só use decode quando os bytes representarem texto e a codificação for conhecida. Uma decodificação terminar sem erro não prova que a codificação escolhida seja a correta. Para preservar dados binários arbitrários, como uma imagem, copie os bytes diretamente: não inclua decode nem encode no caminho.

Relacione operação e resultado

Tipos e comprimentos

Associe cada expressão ao seu resultado.

Toque em um item e depois no par correspondente.

Preservar ou interpretar?

Cópia de conteúdo binário

Um programa leu uma pequena imagem com rb e recebeu um valor bytes. Qual procedimento preserva corretamente o conteúdo ao criar uma cópia?

Passo 6 de 6

Aplicação final: copiar sem alterar os bytes

Integre leitura, gravação e verificação para criar uma cópia binária idêntica e decidir quando conversões de texto são apropriadas.

O percurso de uma cópia binária

Preservar, copiar e conferir

Nesta aplicação, você criará uma origem descartável, lerá seu conteúdo com rb, gravará os mesmos bytes em outro caminho com wb e relerá o destino. A igualdade entre as duas sequências completas confirmará a cópia.

Não há encode nem decode: os dados já são bytes e não precisam ser interpretados como texto.

Fluxo sem conversão textual

Os bytes saem do arquivo de origem, permanecem como bytes na memória e chegam ao destino na mesma ordem.

Diagrama de uma cópia binária com um arquivo de origem, uma sequência de bytes na memória e um arquivo de destino contendo valores idênticos.

O conteúdo percorre origem, memória e destino sem passar por encode ou decode.

Prática no seu computador

Crie, copie e verifique a amostra

Salve como um script Python e execute-o em uma pasta na qual você possa criar arquivos. O programa criará a pasta pratica_binaria e dois arquivos descartáveis dentro dela.

python
from pathlib import Path

pasta = Path("pratica_binaria")
pasta.mkdir(exist_ok=True)

origem = pasta / "origem.bin"
destino = pasta / "copia.bin"
amostra = b"\x00\xffAMOSTRA\r\n\x10\x80fim"

# Prepara a origem binária.
with open(origem, "wb") as arquivo:
    arquivo.write(amostra)

# Lê os bytes da origem.
with open(origem, "rb") as arquivo:
    conteudo_origem = arquivo.read()

# Grava exatamente os mesmos bytes no destino.
with open(destino, "wb") as arquivo:
    arquivo.write(conteudo_origem)

# A gravação já foi fechada; agora o destino pode ser relido.
with open(destino, "rb") as arquivo:
    conteudo_copia = arquivo.read()

print(type(conteudo_copia))
print(len(conteudo_copia))
print(conteudo_copia[0])
print(conteudo_copia[:2])
print(conteudo_origem == amostra)
print(conteudo_copia == conteudo_origem)

Dica

O que conferir

A saída final deve mostrar duas comparações True. O primeiro índice produz o inteiro 0, enquanto a fatia dos dois primeiros elementos produz b'\x00\xff'. Se quiser repetir a prática, os arquivos podem ser sobrescritos porque foram abertos com wb.

Explique a verificação

Relate o resultado

O que confirmou que a cópia preservou o conteúdo? Por que inserir encode ou decode nesse fluxo seria inadequado?

Escreva pelo menos 80 caracteres (0/80).

Decisão final e síntese

Quando converter?

Em qual situação uma conversão textual é apropriada?

Resumo

Síntese do tutorial

Você agora pode distinguir texto de dados binários, inspecionar sequências de bytes e preservar arquivos sem conversões indevidas.

  • str representa texto Unicode; bytes representa uma sequência imutável de valores entre 0 e 255.
  • A indexação de bytes produz um inteiro; uma fatia produz outro valor bytes.
  • rb lê bytes e wb grava bytes, sem codificação textual nem tradução de quebras de linha.
  • A igualdade integral verifica conteúdo e ordem; comprimentos iguais não bastam.
  • texto.encode(codificação) converte str em bytes; dados.decode(codificação) faz o caminho inverso quando os dados representam texto.
  • Conteúdo binário arbitrário deve ser preservado sem uma etapa intermediária de encode ou decode.

Tutorial concluído

Parabéns! Você concluiu: Ler e gravar arquivos binários

Muito bem! Você já sabe preservar bytes e realizar conversões textuais somente quando existe uma codificação conhecida.

100 XP

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso