Мне особенно сложно читать двоичный файл с помощью Python. Можешь дать мне руку? Мне нужно прочитать этот файл, который в Fortran 90 легко читается
int*4 n_particles, n_groups
real*4 group_id(n_particles)
read (*) n_particles, n_groups
read (*) (group_id(j),j=1,n_particles)
Подробно формат файла:
Bytes 1-4 -- The integer 8.
Bytes 5-8 -- The number of particles, N.
Bytes 9-12 -- The number of groups.
Bytes 13-16 -- The integer 8.
Bytes 17-20 -- The integer 4*N.
Next many bytes -- The group ID numbers for all the particles.
Last 4 bytes -- The integer 4*N.
Как я могу прочитать это с помощью Python? Я перепробовал все, но ничего не вышло. Есть ли шанс, что я могу использовать программу f90 на Python, прочитать этот двоичный файл, а затем сохранить данные, которые мне нужны?
fromfile
позволяет легко читать двоичные файлы. Я рекомендую это.Ответы:
Прочтите содержимое двоичного файла следующим образом:
затем «распаковать» двоичные данные с помощью struct.unpack :
Начальные байты:
struct.unpack("iiiii", fileContent[:20])
Тело: игнорировать байты заголовка и завершающий байт (= 24); Оставшаяся часть образует тело, чтобы узнать количество байтов в теле, сделайте целочисленное деление на 4; Полученное частное умножается на строку,
'i'
чтобы создать правильный формат для метода распаковки:Конечный байт:
struct.unpack("i", fileContent[-4:])
источник
import struct
В общем, я бы порекомендовал вам изучить возможность использования для этого модуля Python struct . Это стандартно для Python, и вам должно быть легко перевести спецификацию вашего вопроса в строку форматирования, подходящую для
struct.unpack()
.Обратите внимание, что если между полями и вокруг них есть «невидимые» отступы, вам нужно будет это выяснить и включить в
unpack()
вызов, иначе вы прочитаете неправильные биты.Прочитать содержимое файла, чтобы было что распаковать, довольно тривиально:
Это распаковывает первые два поля, предполагая, что они начинаются в самом начале файла (без заполнения или посторонних данных), а также в предположении собственного порядка байтов (
@
символа). СимволI
s в строке форматирования означает «целое число без знака, 32 бита».источник
Вы можете использовать
numpy.fromfile
, который может читать данные как из текстовых, так и из двоичных файлов. Сначала вы должны создать тип данных, представляющий ваш формат файла, используяnumpy.dtype
, а затем прочитать этот тип из файла, используяnumpy.fromfile
.источник
Чтобы прочитать двоичный файл в
bytes
объект:Чтобы создать
int
из байтов 0-3 данных:Чтобы распаковать несколько
int
s из данных:pathlib
int.from_bytes()
struct
источник
Я тоже обнаружил, что Python не хватает чтения и записи двоичных файлов, поэтому я написал небольшой модуль (для Python 3.6+).
С двоичным файлом вы бы сделали что-то вроде этого (я предполагаю, так как я не знаю Фортран):
Что дает такой вывод:
Я использовал skip (), чтобы пропустить дополнительные данные, добавляемые Fortran, но вместо этого вы можете добавить утилиту для правильной обработки записей Fortran. Если вы это сделаете, запрос на перенос будет приветствоваться.
источник
источник
pickle.load
загружает? Загружает ли он поток Fortran, прямые или последовательные файлы? Они разные и несовместимые.