我有一个用以下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上编译的,其中包含以下可能(或可能不)相关的选项,
答案 0 :(得分:5)
感谢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:]
答案 1 :(得分:2)
我不知道Delphi如何在内部存储数据,但如果它是简单的逐字节数据(因此不是序列化和损坏的),请使用struct。这样,您可以将python文件中的字符串视为二进制数据。另外,打开文件为二进制文件file(open,'rb')
。
答案 2 :(得分:2)
请注意,当您在Delphi中定义记录时(如C中的struct),字段按顺序排列,并且在给定当前对齐的情况下以二进制形式排列(例如,字节在1字节边界上对齐,字节在2字节上,整数在4字节等,但可能因编译器设置而异。
当序列化为文件时,您可能意味着该记录以二进制形式写入文件,而下一条记录是在第一个从位置sizeof(结构)等开始写入之后等等.Delphi没有说明应该如何序列化到/从文件,所以你提供的信息让我们猜测。
如果要确保它始终相同而不受任何编译器设置的干扰,请使用打包记录。
Real可以有多种含义(对于较旧的Delphi版本,它是48位浮点型,后来是64位浮点数(IEEE double))。
如果您无法访问Delphi代码或自行编译,只需使用HEX编辑器检查数据,您应该清楚地看到记录的边界,因为它们从Integers开始,只有浮点数跟随。