Бинарные файлы в отличие от текстовых хранят информацию в виде набора байт. При открытии бинарного файла на чтение или запись также надо учитывать, что нам нужно применять режим "b" в дополнение к режиму записи ("w") или чтения ("r").
При чтении мы получаем файл в виде набора байт, и наоборот, при записи в метод write() передается набор байт. Например, скопируем файл:
FILENAME = "forest.png" # файл для чтения
NEWFILENAME = "forest_new.png" # файл для записи
image_data = [] # список для хранения считанных данных
# считываем файл в список image_data
with open(FILENAME, "rb") as file:
image_data = file.read()
# запись выше считанных байт в новый файл
with open(NEWFILENAME, "wb") as file:
file.write(image_data)
print(f"Файл {FILENAME} скопирован в {NEWFILENAME}")
Считывает файл, путь к которому хранится в переменной FILENAME. В данном случае это файл изображения "forest.png". Считанные байты помещаются в список image_data. Затем этот список записываем в файл с именем NEWFILENAME. Таким образом, мы скопируем содержимое одного файла в другой.
Также для работы с бинарными файлами Python предоставляет специальный встроенный модуль pickle, который упрощает работу с бинарными файлами. Этот модуль предоставляет два метода:
dump(obj, file): записывает объект obj в бинарный файл file
load(file): считывает данные из бинарного файла в объект
Допустим, надо надо сохранить значения двух переменных:
import pickle
FILENAME = "user.dat"
name = "Tom"
age = 19
with open(FILENAME, "wb") as file:
pickle.dump(name, file)
pickle.dump(age, file)
with open(FILENAME, "rb") as file:
name = pickle.load(file)
age = pickle.load(file)
print("Имя:", name, "\tВозраст:", age)
С помощью функции dump последовательно записываются два объекта. Поэтому при чтении файла также последовательно посредством функции load мы можем считать эти объекты. Консольный вывод программы:
Имя: Tom Возраст: 28
Подобным образом мы можем сохранять и извлекать из файла наборы объектов:
import pickle
FILENAME = "users.dat"
users = [
["Tom", 28, True],
["Alice", 23, False],
["Bob", 34, False]
]
with open(FILENAME, "wb") as file:
pickle.dump(users, file)
with open(FILENAME, "rb") as file:
users_from_file = pickle.load(file)
for user in users_from_file:
print("Имя:", user[0], "\tВозраст:", user[1], "\tЖенат/замужем:", user[2])
В зависимости от того, какой объект мы записывали функцией dump, тот же объект будет возвращен функцией load при считывании файла.
Консольный вывод:
Имя: Tom Возраст: 28 Женат/замужем: True Имя: Alice Возраст: 23 Женат/замужем: False Имя: Bob Возраст: 34 Женат/замужем: False