Байтовый массив: продолжение
Итак, как нам записать байтовый массив в двоичный файл?
Посмотрите на код в редакторе. Давайте проанализируем его:
- сначала мы инициализируем
bytearray
с последующими значениями, начиная с10
; если Вы хотите, чтобы содержимое файла было легко читаемым, замените10
чем-то вродеord('a')
- это приведет к получению байтов, содержащих значения, соответствующие алфавитной части ASCII-код (не думайте, что он превратит файл в текстовый файл - он все еще двоичный, так как он был создан с флагомwb
); - затем мы создаем файл с помощью функции
open()
- единственное отличие по сравнению с предыдущими вариантами - это режим открытия, содержащий флагb
; - метод
write()
принимает свой аргумент (bytearray
) и отправляет его (целиком) в файл; - поток затем закрывается обычным способом.
Метод write()
возвращает количество успешно записанных байтов.
Если значения отличаются от длины аргументов метода, это может привести к некоторым ошибкам записи.
В этом случае мы не использовали результат, но это может не сработать в некоторых случаях.
Попробуйте запустить код и проанализировать содержимое вновь созданного выходного файла.
Вы будете использовать его на следующем шаге.
Как читать байты из потока
Чтение из бинарного файла требует использования специального метода с именем readinto()
, так как метод не создает новый объект байтового массива, но заполняет ранее созданный объект значениями, взятыми из бинарного файла.
Примечание:
- метод возвращает количество успешно прочитанных байтов;
- метод пытается заполнить все пространство, доступное внутри аргумента; если в файле больше данных, чем места в аргументе, операция чтения остановится до конца файла; в противном случае результат метода может указывать на то, что байтовый массив был заполнен только фрагментарно (результат также покажет, что часть массива, не используемая вновь прочитанным содержимым, останется нетронутой).
Посмотрите на полный код ниже:
from os import strerror
data = bytearray(10)
try:
binary_file = open('file.bin', 'rb')
binary_file.readinto(data)
binary_file.close()
for b in data:
print(hex(b), end=' ')
except IOError as e:
print("I/O error occurred:", strerror(e.errno))
Давайте проанализируем его:
- сначала мы открываем файл (тот, который Вы создали с помощью предыдущего кода) в режиме, описанном как
rb
; - затем мы читаем его содержимое в байтовый массив с именем
data
, размером десять байт; - наконец, мы печатаем содержимое байтового массива - так как мы ожидали.
Запустите код и проверьте, работает ли он.
Code
from os import strerrordata = bytearray(10)
for i in range(len(data)):
data[i] = 10 + i
try:
binary_file = open('file.bin', 'wb')
binary_file.write(data)
binary_file.close()
except IOError as e:
print("I/O error occurred:", strerror(e.errno))
# Your code that reads bytes from the stream should go here.