Привет! Ты уже умеешь работать с текстовыми файлами: читать, записывать, добавлять. Но что насчёт изображений, аудио, PDF или видео? Это бинарные файлы — их нельзя открыть в блокноте, но Python отлично с ними работает.
В этой статье мы разберём:
- Что такое бинарные файлы
- Режимы
'rb'и'wb' - Как читать и записывать бинарные данные
- Чтение больших бинарных файлов по частям
- Практические примеры: копирование изображений, работа с байтами
- Что нужно знать перед началом
- Основная часть
- Что такое бинарные файлы?
- Отличие текстовых и бинарных файлов
- Режимы открытия бинарных файлов
- Чтение бинарных файлов
- Чтение всего файла
- Чтение по частям (для больших файлов)
- Запись бинарных файлов
- Запись данных из байтовой строки
- Копирование файла
- Работа с байтами в Python
- bytes — неизменяемая последовательность байтов
- bytearray — изменяемая последовательность байтов
- Практические примеры
- Копирование изображения с прогрессом
- Сохранение данных из интернета
- SHA256-хеш файла
- Сравнение двух файлов
- Разница между ‘b’ и без ‘b’
- Шпаргалка по бинарным файлам
- Задачи для закрепления
- Нюансы и подводные камни
- Кодировка в бинарных файлах
- Чтение больших файлов
- Порядок байтов (endianness)
- Частые ошибки и как их избежать
- Ошибка 1: Неправильный режим для бинарного файла
- Ошибка 2: Забыл ‘b’ в режиме
- Ошибка 3: Неправильная работа с байтовыми строками
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный 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' |
| Создать bytearray | bytearray(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' - Читать бинарные файлы целиком и по частям
- Записывать бинарные данные
- Работать с байтовыми строками (
bytes,bytearray) - Копировать изображения и другие бинарные файлы








