Решение ошибки TypeError в pickle.dump: str, а не bytes
Быстрый ответ
Чтобы исправить ошибку TypeError: ожидалось str, а получено bytes при использовании pickle.dump, откройте файл в бинарном режиме, применяя флаг 'wb'. Вот верный пример кода:
import pickle
# Оперируем байтами, а не текстом!
with open('output.pkl', 'wb') as f:
pickle.dump(data_to_save, f)
Поменяйте 'output.pkl' на имя своего файла и data_to_save на объект, который вы хотите сохранить.
До момента "законсервирования" данных
Pickle – это модуль Python для сериализации (упаковки) и десериализации (распаковки) объектов языка Python. Ошибка „ожидалось str, а получено bytes“ обычно возникает, когда вы пытаетесь сохранить объект в файл, открытый в текстовом режиме, а не в бинарном.
Другими словами, вы попытались запихнуть маринованные огурцы в конверт, а не в закупоренную банку.
Что важно знать о бинарном режиме?
Бинарный режим крайне важен. Он гарантирует точность записи и чтения данных, а также предохраняет от возможных проблем, связанных с переносом строк.
При чтении файла с использованием pickle используйте режим 'rb':
# Пускай крутятся байты!
with open('output.pkl', 'rb') as f:
data_loaded = pickle.load(f)
Сначала сериализуем в байты
Сериализуйте ваш объект в байтовую строку перед записью его в файл:
# Законсервируем данные!
serialized_data = pickle.dumps(data_to_save)
# Запишем их в файл
with open('output.pkl', 'wb') as f:
f.write(serialized_data)
Из байтов к собственно данным
Для десериализации данных:
# Готовимся разогревать!
with open('output.pkl', 'rb') as f:
serialized_data = f.read()
# Возвращаем объект в рабочее состояние
data_loaded = pickle.loads(serialized_data)
Визуализация
Считайте режимы открытия файла как предполетный чек-лист:
🗄️ == Режимы открытия файла == 🗄️
Установите флаг:
- Текстовый режим (📄✏️) -> Готовимся работать со строками (str)
- Бинарный режим (🔒💾) -> Готовимся работать с байтами (bytes)
Небольшая памятка:
# Хотите ошибку TypeError? (Нет, спасибо...)
with open('data.txt', 'w') as file:
pickle.dump(data, file) # Это ошибка!
# Действуйте, как профи!
with open('data.bin', 'wb') as file:
pickle.dump(data, file) # Это верно!
В двух словах:
Запись `str` ➡️ 📄✏️ (Текстовый режим)
Запись `bytes` ➡️ 🔒💾 (Бинарный режим)
Не забывайте выбирать правильный режим при сохранении данных.
Советы и рекомендации
1. Особенности типов данных
Для „законсервирования“ данных нужны байты. Записывать их как текст — это как пытаться кормить кошку собачьим кормом: возможно, но неправильно.
2. Протоколы и их значение
Протоколы pickle — чем больше номер, тем новее протокол. Это как даты выпуска версий программного обеспечения: больше — значит, новее. Однако учтите совместимость — старые версии Python могут не поддерживать новые протоколы.
# Используйте самый актуальный доступный протокол
pickle.dump(data_to_save, f, protocol=pickle.HIGHEST_PROTOCOL)
3. Обменивайтесь данными с умом
Обмен сериализованными объектами между разными версиями Python требует понимания различий в протоколах.
4. Безопасность превыше всего!
Десериализация может привести к выполнению кода, поэтому сериализованным данным следует доверять только если источник достоверен и проверен.
Полезные материалы
- pickle — Сериализация объектов в Python (Documentación de Python 3.12.2) — Официальное описание механизма сериализации в Python.
- Модуль pickle в Python: как сохранить объекты (Real Python) — Подробный разбор модуля pickle в Python.
- Строки и байты в Python 3 (Погружение в Python 3) — Объяснение типов данных: особенно байт и строк.
- Сериализация в Python с помощью модуля Pickle (YouTube) — Доступное видео о модуле pickle для начинающих.
- Работа с бинарными данными в Python (DevDungeon) — Руководство по основам работы с бинарными данными в Python.