Запись двоичных данных в файл в Python

Я пытаюсь записать данные (текст, данные с плавающей запятой) в файл в двоичном формате, который позже будет прочитан другой программой. Проблема в том, что эта программа (в Fort95) невероятно специфична; каждый байт должен находиться в нужном месте, чтобы файл читался правильно. Я пытался использовать объекты Bytes и .encode () для записи, но не имел большой удачи (могу сказать из размера файла, что он пишет дополнительные байты данных). Какой-то код, который я пробовал:

mgcnmbr='42' bts=bytes(mgcnmbr) test_file=open(PATH_HERE/test_file.dat','ab') test_file.write(bts) test_file.close() 

Я также пробовал:

 mgcnmbr='42' bts=mgcnmbr.encode(utf_32_le) test_file=open(PATH_HERE/test_file.dat','ab') test_file.write(bts) test_file.close() 

Чтобы уточнить, мне нужно целочисленное значение 42, записанное как 4-байтовый двоичный файл. Затем я буду писать числа 1 и 0 в 4 байтовых двоичных файлах. В этот момент у меня должно быть ровно 12 байт. Каждый из них представляет собой 4-байтовое целое число со знаком, записанное в двоичном формате. Я довольно новичок в Python и не могу заставить его работать. Какие-либо предложения? Что-то вроде этого ? Мне нужен полный контроль над количеством байтов каждого целого (а затем и 4 байта с плавающей запятой).

благодаря

3 Solutions collect form web for “Запись двоичных данных в файл в Python”

Вам нужен структурный модуль.

 import struct fout = open('test.dat', 'wb') fout.write(struct.pack('>i', 42)) fout.write(struct.pack('>f', 2.71828182846)) fout.close() 

Первый аргумент в struct.pack – это строка формата.

Первый символ в строке формата задает порядок байтов или сущность данных (является самым значимым или наименее значимым байтом, сохраненным первым – big-endian или little-endian). Эндиантность варьируется от системы к системе. Если «>» не работает, попробуйте «<».

Второй символ в строке формата – это тип данных. Неудивительно, что «i» означает целое число, а «f» обозначает float. Количество байтов определяется типом. Шорты или «h», например, имеют длину два байта. Существуют также коды для неподписанных типов. Например, «Н» соответствует короткому знаку без знака.

Второй аргумент в struct.pack – это, конечно, значение, которое должно быть упаковано в объект байтов.

Вот часть, где я говорю вам, что я лгал о нескольких вещах. Сначала я сказал, что количество байтов определяется типом. Это отчасти верно. Размер данного типа технически зависит от платформы, поскольку стандарт C / C ++ (на котором основан структурный модуль) указывает только минимальные размеры. Это приводит меня ко второй ложью. Первый символ в строке формата также кодирует, должно ли использоваться стандартное (минимальное) количество байтов или собственное (зависимое от платформы) количество байтов. (Оба «>» и «<» гарантируют, что используется стандартное минимальное количество байтов, которое на самом деле четыре в случае целого числа «i» или «float» f). Оно дополнительно кодирует выравнивание данных.

Документация на модуле struct содержит таблицы для параметров строки формата.

Вы также можете упаковать несколько примитивов в объект с одним байтом и реализовать тот же результат.

 import struct fout = open('test.dat', 'wb') fout.write(struct.pack('>if', 42, 2.71828182846)) fout.close() 

И вы можете разделить двоичные данные с помощью struct.unpack.

Предполагая, что вы хотите этого в little-endian, вы можете сделать что-то подобное, чтобы написать 42 в четырехбайтовом двоичном формате.

 test_file=open(PATH_HERE/test_file.dat','ab') test_file.write(b'\xA2\0\0\0') test_file.close() 

A2 имеет значение 42 в шестнадцатеричном формате, а байты '\xA2\0\0\0' делают первый байт равным 42, за которым следуют три пустых байта. Этот код записывает байт: 42, 0, 0, 0.

Ваш код записывает байты для представления символа «4» в UTF 32 и байты для представления 2 в UTF 32. Это означает, что он записывает байты: 52, 0, 0, 0, 50, 0, 0, 0, поскольку каждый символ составляет четыре байта при кодировании в UTF 32.

Кроме того, для вас может быть полезно использовать шестнадцатеричный редактор для отладки, тогда вы можете увидеть байты, которые выводит ваша программа, а не только размер.

В моей проблеме Запись двоичной строки в двоичном файле Python 3.4 Мне нравится следующее:

 file.write(bytes(chr(int(mgcnmbr)), 'iso8859-1')) 
  • Как печатать как printf в python3?
  • Модуль проверки Python: ключевое слово только args
  • Несколько циклов 'for' в генераторе словарей
  • Удивлены хорошие результаты рекурсии в python
  • Почему Python расширяет выход ]
  • Почему я должен добавить python в PATH
  • измените некоторые строчные буквы на верхний регистр строки
  • Оптимальный / самый быстрый способ подсчета дат в списке python
  • Python - лучший язык программирования в мире.