У меня есть файл, который был записан со следующим объявлением Delphi...
Type
Tfulldata = Record
dpoints, dloops : integer;
dtime, bT, sT, hI, LI : real;
tm : real;
data : array[1..armax] Of Real;
End;
...
Var:
fh: File Of Tfulldata;
Я хочу проанализировать данные в файлах (многие МБ в размере) использование Python, если возможный - там простой способ читать в данных и бросить данные в объекты Python, подобные в форме к записям Delphi? Кто-либо знает о библиотеке, возможно, которая делает это?
Это компилируется на Delphi 7 со следующими опциями, которые могут (или не может) быть подходящим,
Вот полные решения благодаря подсказкам KillianDS и Ritsaert Hornstra
import struct
fh = open('my_file.dat', 'rb')
s = fh.read(40256)
vals = struct.unpack('iidddddd5025d', s)
dpoints, dloops, dtime, bT, sT, hI, LI, tm = vals[:8]
data = vals[8:]
Я не знаю, как Delphi хранит данные внутри, но если это простые побайтовые данные (не сериализованные и не искаженные), используйте структура . Таким образом, вы можете рассматривать строку из файла Python как двоичные данные. Также открывайте файлы в виде двоичного файла (open, 'rb')
.
Обратите внимание, что когда вы определяете запись в Delphi (например, структуру в C), поля расположены по порядку и в двоичном формате с учетом текущего выравнивания (например, байты выровнены по границам 1 байта, слова по 2 байтам, целые числа по 4 байтам и т. д., но это может варьироваться в зависимости от настроек компилятора.
При сериализации в файл, вы, вероятно, имеете в виду, что эта запись записывается в двоичном формате в файл, а следующая запись записывается после первой, начиная с позиции sizeof (структуры) и т.д. и т.д. Delphi не указывает, как вещь должна быть сериализована в / из файла, поэтому информация вы даете нам возможность гадать.
Если вы хотите убедиться, что это всегда одно и то же, без вмешательства каких-либо настроек компилятора, используйте упакованную запись.
Real может иметь несколько значений (это 48-битный тип с плавающей запятой для более старых версий Delphi версии и более поздние версии 64-битного числа с плавающей запятой (IEEE double)).
Если вы не можете получить доступ к коду Delphi или скомпилировать его самостоятельно, ju Чтобы проверить данные с помощью HEX-редактора, вы должны четко видеть границы записей, поскольку они начинаются с целых чисел, а следуют только числа с плавающей запятой.