在Python中读取Delphi二进制文件
我有一个文件,它是用以下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分析这个文件里的数据(文件大小有好几MB),请问有没有简单的方法可以读取这些数据,并把它们转换成类似Delphi记录的Python对象?有没有人知道有没有这样的库可以用?
这个文件是在Delphi 7上编译的,以下选项可能(也可能不)相关:
- 记录字段对齐:8
- Pentium安全FDIV:否
- 堆栈帧:否
- 优化:是
3 个回答
请注意,当你在Delphi中定义一个记录(类似于C语言中的结构体)时,字段的排列是有顺序的,并且是以二进制形式存储的,具体取决于当前的对齐方式(比如字节在1字节边界对齐,字在2字节边界对齐,整数在4字节边界对齐等等,但这可能会根据编译器的设置有所不同)。
当你把这个记录保存到文件中时,可能是指这个记录以二进制形式写入文件,接下来的记录会紧接着第一个记录写入,从位置sizeof(结构体)开始,依此类推。Delphi并没有明确规定如何将数据序列化到文件中,所以你提供的信息让我们很难猜测。
如果你想确保数据在不同的编译器设置下始终保持一致,可以使用“packed record”(紧凑记录)。
在Delphi中,Real类型有多种含义(在旧版本中是48位浮点数,后来变成了64位浮点数,即IEEE双精度)。
如果你无法访问Delphi代码或自己编译,可以尝试用十六进制编辑器查看数据,你应该能清楚地看到记录的边界,因为它们是以整数开始,后面跟着浮点数。
我不知道Delphi是怎么内部存储数据的,但如果它的数据很简单,就像字节那样(也就是说不是经过复杂处理的),你可以使用struct模块。这样,你就可以把Python文件中的字符串当作二进制数据来处理。另外,打开文件的时候要以二进制模式打开,像这样:file(open,'rb')
。
这里是完整的解决方案,感谢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:]