У меня есть список байтов как целых чисел, что-то вроде
[120, 3, 255, 0, 100]
Как я могу записать этот список в файл как двоичный?
Это сработает?
newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
TypeError: argument 1 must be string or buffer, not list
.Ответы:
Это как раз то
bytearray
, для чего:Если вы используете Python 3.x, вы можете использовать
bytes
вместо него (и, вероятно, должны, поскольку это лучше сигнализирует о ваших намерениях). Но в Python 2.x это не сработает, потому чтоbytes
это просто псевдоним дляstr
. Как обычно, показывать с помощью интерактивного интерпретатора проще, чем объяснять с помощью текста, поэтому позвольте мне просто сделать это.Python 3.x:
Python 2.x:
источник
str.encode
иstruct.pack
если вам нужно работать с 2.2. Но 2.6 отсутствует уже 5 лет; все три Ubuntu LTS все еще поддерживаются, все три версии OS X в поддержке, предыдущая основная версия CentOS / RHEL и т. д. - все они уже встроены. Если вам нужно поддерживать 2.5, 2.1 или 1.6 или что-то еще, вы, вероятно, знаю…bytearray
прежнему преобразуется\n
в\r\n
, что делает его неудовлетворительным для двоичных данных, если флаг «b» не передается при открытии файла.\r\n
функция является частью универсальных опций новой строки для текста.)Используйте
struct.pack
для преобразования целочисленных значений в двоичные байты, затем запишите байты. НапримерОднако я бы никогда не дал бинарному файлу
.txt
расширение.Преимущество этого метода заключается в том, что он работает и для других типов, например, если какое-либо из значений было больше 255, вы могли бы использовать его
'5i'
для формата вместо того, чтобы получить полные 32-битные целые числа.источник
Чтобы преобразовать целые числа <256 в двоичные, используйте
chr
функцию. Итак, вы собираетесь сделать следующее.источник
charmap
а неascii
, и работает как на python2, так и на python3.ascii
Кодирование работает только в python2.Начиная с Python 3.2+, вы также можете сделать это с помощью
to_bytes
собственного метода int:Т.е. каждый отдельный вызов
to_bytes
в этом случае создает строку длиной 1 с ее символами, расположенными в обратном порядке (что тривиально для строк длиной 1), что представляет собой целое значениеbyte
. Вы также можете сократить последние две строки в одну:источник
Вы можете использовать следующий пример кода с синтаксисом Python 3:
Вот однострочник оболочки:
источник
Используйте рассол, например: импортный рассол
Ваш код будет выглядеть так:
Чтобы прочитать данные обратно, используйте метод pickle.load
источник