直接用python读取二进制文件以使用fo统计分析

2024-09-21 03:01:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试直接用python读取二进制文件,而不将其转换为ascii或文本格式。在

我已经从这个二进制文件中得到了ascii转换的数据,但是分析结果似乎有点可疑。在

所以,我想用这个二进制文件本身来进行分析。在

在我之前的问题中,我甚至不知道我的文件格式。所以,我试着用od-xc函数来检查它。在

我的二进制数据如下所示:

12335640    003c    0400    0060    0000    0000    fc1a    0b61    0016
          <  \0  \0 004   `  \0  \0  \0  \0  \0 032   ?  a  \v 026  \0
12335660    c000    040f    c000    040f    0000    0000    0000    0000
          \0   ?017 004  \0   ?017 004  \0  \0  \0  \0  \0  \0  \0  \0
12335700    01ea    0fab    07dd    0e07    1c15    07dd    0e07    1c15
          ?001   ?017   ? \a  \a 016 025 034   ? \a  \a 016 025 034

我不太熟悉二进制格式,但除了第一列之外,这种格式看起来主要是4字节。在

我试着像前面的问题一样使用binascii模块,但它似乎不起作用。在

任何想法或帮助都将不胜感激。在

我在上一个问题中使用的代码是:

^{pr2}$

谢谢你

伊萨克


Tags: 模块文件数据函数文本格式代码字节格式
2条回答

您可能需要使用numpy模块将文件读入数字阵列. 在

例如:

import numpy

print numpy.fromstring('abcd', dtype='u1')
# 8-bit unsigned int: [97,97,97,97]

print numpy.fromstring('abcd', dtype='i2')
# 16-bit signed int [25185, 25699]

print numpy.fromstring('abcd', dtype='<f4')
# 32-bit float (little-endian): 1.67779994e+22

print numpy.fromstring('abcd', ftype='>f4')
# 32-bit float (big-endian): 2.61007876e+20

这适用于几乎所有具有恒定记录结构的数据文件。有关numpy.fromfile的更复杂的示例,请参见http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html。如果你的二进制文件有常量记录,你可以用一个命令将它们加载到一个易于使用的数组中,以获得更多的数学信息。在

与您前面的问题一样,此数据可以表示任何东西。它可以是big-endian浮点值,也可以是小的尾数整数等等。您可以通过查找一些常见的重复值或已知值的位置对格式进行有根据的猜测,但这很容易出错。在

如果,假设,数据只是一个4字节的单精度浮点数字流,并且具有本机端性,那么可以使用^{} module将二进制数据从类C结构解码为Python类型。在

from struct import unpack
f = open(fn, 'rb') # don't forget the b, https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
output_list = []

while True:
    chunk = f.read(4)
    if len(chunk)<4:
        break
    value = unpack("f", chunk)
    output_list.append(value)

。。。毕竟,你应该有一个浮点值的列表。在

相关问题 更多 >

    热门问题