Работа с бинарными файлами: ‘rb’, ‘wb’

Работа с бинарными файлами: ‘rb’, ‘wb’ Работа с файлами

Привет! Ты уже умеешь работать с текстовыми файлами: читать, записывать, добавлять. Но что насчёт изображений, аудио, PDF или видео? Это бинарные файлы — их нельзя открыть в блокноте, но Python отлично с ними работает.

В этой статье мы разберём:

  • Что такое бинарные файлы
  • Режимы 'rb' и 'wb'
  • Как читать и записывать бинарные данные
  • Чтение больших бинарных файлов по частям
  • Практические примеры: копирование изображений, работа с байтами
Содержание
  1. Что нужно знать перед началом
  2. Основная часть
  3. Что такое бинарные файлы?
  4. Отличие текстовых и бинарных файлов
  5. Режимы открытия бинарных файлов
  6. Чтение бинарных файлов
  7. Чтение всего файла
  8. Чтение по частям (для больших файлов)
  9. Запись бинарных файлов
  10. Запись данных из байтовой строки
  11. Копирование файла
  12. Работа с байтами в Python
  13. bytes — неизменяемая последовательность байтов
  14. bytearray — изменяемая последовательность байтов
  15. Практические примеры
  16. Копирование изображения с прогрессом
  17. Сохранение данных из интернета
  18. SHA256-хеш файла
  19. Сравнение двух файлов
  20. Разница между ‘b’ и без ‘b’
  21. Шпаргалка по бинарным файлам
  22. Задачи для закрепления
  23. Нюансы и подводные камни
  24. Кодировка в бинарных файлах
  25. Чтение больших файлов
  26. Порядок байтов (endianness)
  27. Частые ошибки и как их избежать
  28. Ошибка 1: Неправильный режим для бинарного файла
  29. Ошибка 2: Забыл ‘b’ в режиме
  30. Ошибка 3: Неправильная работа с байтовыми строками
  31. Шпаргалка
  32. Заключение
  33. КВИЗ
  34. Что дальше?

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание открытия файлов
  • Желание работать с разными типами файлов

Совет: Бинарные файлы — это файлы, которые хранят данные в байтах, а не в тексте. Изображения, музыка, видео, PDF, ZIP — всё это бинарные файлы.

Основная часть

Что такое бинарные файлы?

Бинарные файлы — это файлы, которые хранят данные в виде последовательности байтов (0 и 1). В отличие от текстовых файлов, они не имеют кодировки и не разбиты на строки.

Примеры бинарных файлов:

  • Изображения: .jpg.png.gif
  • Аудио: .mp3.wav
  • Видео: .mp4.avi
  • Документы: .pdf.docx
  • Архивы: .zip.rar

Совет: Текстовые файлы — это частный случай бинарных. Python умеет работать с обоими типами, просто по-разному.

Отличие текстовых и бинарных файлов

ХарактеристикаТекстовыеБинарные
Режимы'r''w''a''rb''wb''ab'
ДанныеСтроки (str)Байты (bytes)
КодировкаЕсть (UTF-8 и т.д.)Нет
СтрокиРазбиты на строкиНет строк
Примеры.txt.csv.json.jpg.mp3.pdf

Совет: В бинарных файлах нет понятия «строка». Всё — просто последовательность байтов.

Режимы открытия бинарных файлов

РежимОписание
'rb'Чтение бинарного файла (read binary)
'wb'Запись бинарного файла (write binary)
'ab'Добавление в конец бинарного файла
'rb+'Чтение и запись
# Открываем для чтения
with open('image.jpg', 'rb') as file:
    data = file.read()

# Открываем для записи
with open('copy.jpg', 'wb') as file:
    file.write(data)

Совет: 'rb' — входящий файл должен существовать. 'wb' — создаст новый или перезапишет существующий.

Чтение бинарных файлов

Чтение всего файла

# Чтение всего файла в память
with open('image.jpg', 'rb') as file:
    data = file.read()
    print(type(data))      # <class 'bytes'>
    print(f"Размер: {len(data)} байт")

Чтение по частям (для больших файлов)

# Чтение по 1024 байта за раз
with open('large_file.bin', 'rb') as file:
    while True:
        chunk = file.read(1024)  # Читаем 1 КБ
        if not chunk:            # Если chunk пустой — конец файла
            break
        process_chunk(chunk)     # Обрабатываем кусок

Совет: Для больших файлов всегда читай по частям! Это экономит память.

Запись бинарных файлов

Запись данных из байтовой строки

# Создаём байтовую строку
data = b'Hello, Binary World!'

with open('output.bin', 'wb') as file:
    file.write(data)

Копирование файла

def copy_file(source, destination):
    with open(source, 'rb') as src:
        with open(destination, 'wb') as dst:
            while True:
                chunk = src.read(8192)  # 8 КБ
                if not chunk:
                    break
                dst.write(chunk)
    print(f"Файл скопирован: {source} -> {destination}")

# Копируем изображение
copy_file('photo.jpg', 'photo_copy.jpg')

Совет: Размер буфера (8192) — хороший баланс между скоростью и памятью.

Работа с байтами в Python

bytes — неизменяемая последовательность байтов

# Создание байтовых строк
b1 = b'hello'                        # Из строки
b2 = bytes([65, 66, 67])             # Из списка чисел
b3 = b'\x48\x65\x6c\x6c\x6f'         # HEX-формат

print(b1)  # b'hello'
print(b2)  # b'ABC'
print(b3)  # b'Hello'

bytearray — изменяемая последовательность байтов

# Создаём изменяемый массив байтов
ba = bytearray(b'hello')
ba[0] = 72  # 'h' -> 'H' (72 это 'H')
print(ba)   # bytearray(b'Hello')

Совет: bytearray удобен, если нужно изменять данные в процессе работы.

Практические примеры

Копирование изображения с прогрессом

import os

def copy_with_progress(source, destination):
    file_size = os.path.getsize(source)
    copied = 0
    
    with open(source, 'rb') as src:
        with open(destination, 'wb') as dst:
            while True:
                chunk = src.read(8192)
                if not chunk:
                    break
                dst.write(chunk)
                copied += len(chunk)
                progress = (copied / file_size) * 100
                print(f"\rПрогресс: {progress:.1f}%", end='')
    
    print("\nКопирование завершено!")

copy_with_progress('video.mp4', 'video_copy.mp4')

Сохранение данных из интернета

import requests

# Скачиваем изображение
url = 'https://example.com/image.jpg'
response = requests.get(url)

# Сохраняем как бинарный файл
with open('downloaded_image.jpg', 'wb') as file:
    file.write(response.content)

print("Изображение сохранено!")

SHA256-хеш файла

import hashlib

def calculate_sha256(filename):
    sha256_hash = hashlib.sha256()
    with open(filename, 'rb') as file:
        for chunk in iter(lambda: file.read(4096), b''):
            sha256_hash.update(chunk)
    return sha256_hash.hexdigest()

# Хеш изображения
hash_value = calculate_sha256('image.jpg')
print(f"SHA256: {hash_value}")

Сравнение двух файлов

def files_are_equal(file1, file2):
    with open(file1, 'rb') as f1:
        with open(file2, 'rb') as f2:
            while True:
                chunk1 = f1.read(4096)
                chunk2 = f2.read(4096)
                if chunk1 != chunk2:
                    return False
                if not chunk1:  # Конец обоих файлов
                    return True

# Сравниваем
equal = files_are_equal('image.jpg', 'image_copy.jpg')
print(f"Файлы одинаковы: {equal}")

Разница между ‘b’ и без ‘b’

# Текстовый режим
with open('file.txt', 'r') as file:
    content = file.read()      # Возвращает str

# Бинарный режим
with open('file.txt', 'rb') as file:
    content = file.read()      # Возвращает bytes

Совет: Для изображений, видео и аудио всегда используй бинарный режим. Для текста — текстовый.

Шпаргалка по бинарным файлам

Что нужноКак пишется
Открыть для чтенияopen('file', 'rb')
Открыть для записиopen('file', 'wb')
Открыть для добавленияopen('file', 'ab')
Прочитать весь файлdata = file.read()
Прочитать частьchunk = file.read(1024)
Записать байтыfile.write(data)
Проверить конец файлаif not chunk: break
Создать байтовую строкуb'hello'
Создать bytearraybytearray(b'hello')
Копировать файлshutil.copy('src', 'dst') (проще!)

Задачи для закрепления

Задача 1. Открой файл image.jpg в бинарном режиме и прочитай его содержимое.

Задача 2. Создай копию файла, читая по 4096 байт за раз.

Задача 3. Запиши байтовую строку b'Python binary' в файл test.bin.

Задача 4. Скачай изображение по URL и сохрани его как бинарный файл.

Задача 5. В чём разница между 'r' и 'rb'?

Ответы:

Задача 1.

with open('image.jpg', 'rb') as file:
    data = file.read()
    print(f"Размер: {len(data)} байт")

Задача 2.

with open('image.jpg', 'rb') as src:
    with open('image_copy.jpg', 'wb') as dst:
        while True:
            chunk = src.read(4096)
            if not chunk:
                break
            dst.write(chunk)

Задача 3.

with open('test.bin', 'wb') as file:
    file.write(b'Python binary')

Задача 4.

import requests
response = requests.get('https://example.com/image.jpg')
with open('image.jpg', 'wb') as file:
    file.write(response.content)

Задача 5.

'r' — текстовый режим, возвращает строки (str). 'rb' — бинарный режим, возвращает байты (bytes). Текстовый требует кодировку, бинарный — нет.

Нюансы и подводные камни

Кодировка в бинарных файлах

В бинарном режиме кодировка не указывается — данные читаются как есть.

Чтение больших файлов

Никогда не используй file.read() без аргумента для очень больших файлов. Всегда читай по частям.

Порядок байтов (endianness)

При работе с бинарными данными из других систем может быть важен порядок байтов. Используй модуль struct для чтения структурированных бинарных данных.

Частые ошибки и как их избежать

Ошибка 1: Неправильный режим для бинарного файла

# Ошибка — бинарный файл открыт в текстовом режиме
with open('image.jpg', 'r') as file:
    data = file.read()

# Правильно
with open('image.jpg', 'rb') as file:
    data = file.read()

Ошибка 2: Забыл ‘b’ в режиме

# Ошибка — будет писать строки, а не байты
with open('output', 'w') as file:
    file.write(b'hello')  # Ошибка!

# Правильно
with open('output', 'wb') as file:
    file.write(b'hello')

Ошибка 3: Неправильная работа с байтовыми строками

# Ошибка — смешивание str и bytes
data = b'hello'
text = data + ' world'  # TypeError

# Правильно
text = data + b' world'

Шпаргалка

Что нужноКак пишется
Чтение бинарного файлаopen('file', 'rb')
Запись бинарного файлаopen('file', 'wb')
Добавление в бинарный файлopen('file', 'ab')
Чтение по частямfile.read(4096)
Проверка конца файлаif not chunk: break
Копирование файлаshutil.copy('src', 'dst')

Заключение

Сегодня мы научились:

  • Отличать бинарные файлы от текстовых
  • Открывать бинарные файлы в режимах 'rb' и 'wb'
  • Читать бинарные файлы целиком и по частям
  • Записывать бинарные данные
  • Работать с байтовыми строками (bytesbytearray)
  • Копировать изображения и другие бинарные файлы

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×