使用Python转换二进制文件(Labview .DAT文件)
我在一个实验室工作,我们使用自定义的Labview虚拟仪器(VIs)来获取电生理记录,这些记录通过4个通道进行采集,保存为.DAT(二进制)文件。之后,我们可以在更多的Labview VIs中继续分析这些文件,但我想用Python来分析我的所有记录。首先,我需要遍历所有文件并将它们从二进制格式转换出来!
我尝试过使用numpy.fromfile(文件名),但得到的数字让我感到困惑:
array([ 3.44316221e-282, 1.58456331e+029, 1.73060724e-077, ..., 4.15038967e+262, -1.56447362e-090, 1.80454329e+070])
为了进一步了解,我查找了.DAT文件的头部格式,以便理解如何提取字节并进行转换——比如数据是以多少字节保存的等等: http://zone.ni.com/reference/en-XX/help/370859J-01/header/header/headerallghd_allgemein/
但是我还是搞不清楚该怎么做。当我在终端输入“head 文件名”时,看到的内容如下:
例如:>> head 2014_04_10c1slice2_rest.DAT
DTL? 0???? @@???? empty array PF?c ƀ????l?N?"1'.+?K13:13:27;0.00010000-08??t???DY ??N?t?x???D? ?uv?tgD?~I?? ??N?t?x>?n?? ????t?x>?n?? ????t???D? ????t?x???D? ????t?x?~I?? ????tgD>?n?? ??N?tgD???D? ??N?t?x???D? ????t????DY ??N?t?x>?n?? ??N?t????DY ?Kn$?t?????DY ??N?t??>?n?? ??N?tgD>?n?? ????t?x?~I?? ????tgD>?n?? ??N?tgD>?n?? ??N?tgD???DY ????t?x???D? ????t???~I?? ??N?tgD???DY ??N?tgD???D? ??N?t?~I?? ??N?t?x???DY ??N?tF>?n?? ??N?t?x??%Y
如果有人能提供帮助或建议该怎么做,我将非常感激。
谢谢。
附言:有一个旧的(坏掉的)matlab文件,似乎是为了转换这些文件而准备的。我觉得这可能会有帮助,但我花了几天时间试图理解它,仍然感到困惑。http://www.mathworks.co.uk/matlabcentral/fileexchange/27195-load-labview-binary-data
2 个回答
DAT这个后缀其实挺常见的,并不一定指向某种特定的格式。如果我理解得没错的话,那个帮助部分是关于DIAdem的,可能和你从LV保存的数据完全没有关系。
你需要的是这个帮助部分,它告诉你LV是如何把数据处理成可以存储在磁盘上的格式的 - http://zone.ni.com/reference/en-XX/help/371361J-01/lvconcepts/flattened_data/
你需要查看LV的代码,看看你到底保存了什么类型的数据,以及写入文件的功能是怎么配置的(比如字节顺序、大小前缀等等),然后再用那个文档来理解实际的数据表示方式。
根据这个链接,下面的代码应该可以解决问题:
binaryFile = open('Measurement_4.bin', mode='rb')
(data.offset,) = struct.unpack('>d', binaryFile.read(8))
注意,mode
设置为'rb'
是为了以二进制模式打开文件。
使用numpy
,你可以直接这样做:
data = numpy.fromfile('Measurement_4.bin', dtype='>d')
请注意,如果你只是想用Python作为中间工具,并且想把数据再返回给LabVIEW,那么你应该使用Read from Binary file.vi这个函数来用LabVIEW原生方式读取二进制文件。