Бинарные файлы

Последнее обновление: 02.02.2024

Бинарные файлы в отличие от текстовых хранят информацию в виде набора байт. При открытии бинарного файла на чтение или запись также надо учитывать, что нам нужно применять режим "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. Таким образом, мы скопируем содержимое одного файла в другой.

Модуль pickle

Также для работы с бинарными файлами 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850