Как сохранить стороку данных нулей и единиц в бинарной кодировке 1 символ = 1 bit?
Подскажите, есть ли какая-нибудь простая возможность битовую строку длиной примерно 2^17 < n < 2^23, сохранить в файл с кодировкой на один символ 1 bit?
Допустим, выполнив код:
with open('data/bin_file.bin', 'wb') as bin_file:
str = ''
for i in range(1024):
str += '1'
bin_file.write(str.encode())
то на выходе получим файл bin_file.bin, но при этом, в нем всё также будет выделено на один символ 1 байт. Как я понял это особенность самого менеджера файлов с ключем b, что он записывает всё как байтстроку (или питона в целом?)? Как это обойти?
И, в общем, в связи с этим и вопрос, как сохранить, и затем считать, бинарные данные в файл так, чтобы кодировалось 1 символ = 1 bit?
Нужно это всё для экономии места, т.к. таких файлов ещё около n.
В интернетах пишут что можно считывать по 8 бит и конвертировать в символ utf-8, после уже записывать, и в обратном порядке соответственно декодировать, но такой вариант не для меня, т.к. много работы с исходными битовыми данными, и постоянно кодировать/декодировать миллионы значений в миллионах файлов чтобы что-то вытащить/сравнить и т.д. просто неудобно, плюс в данном случае нагружается уже проц, что тоже не сильно хорошо.
Или я что-то делаю не так?
Ответы (1 шт):
Вам необходимо использовать метод bitarray.tofile() с модуля bitarray для того, чтобы запись битовых строк в файле производилась в формате: 1 символ = 1 bit.
Более детально можете ознакомиться на pypi.org
Код решения:
import bitarray
# Создаем битовую строку
bit_string = bitarray.bitarray()
bit_string.frombytes(b'Hello StackOverFlow')
# Открываем файл для записи в бинарном формате
with open('data/bin_file.bin', 'wb') as bin_file:
bit_string.tofile(bin_file)
# Открываем файл для чтения в бинарном формате
with open('data/bin_file.bin', 'rb') as bin_file:
bit_string = bitarray.bitarray()
bit_string.fromfile(bin_file)
# Декодируем битовую строку в строку utf-8
decoded_string = bit_string.tobytes().decode('utf-8')
# Выводим полученную битовую строку
print(bit_string)
# Выводим результат декодирования
print(decoded_string)
Результат даного кода будет таковым:
bitarray('01001000011001010110110001101100011011110010000001010011011101000110000101100011011010110100111101110110011001010111001001000110011011000110111101110111')
Hello StackOverFlow
А количество bit будет соответствовать количеству символов - 19:

