在python中读取复杂的二进制文件

时间:2013-01-21 15:19:19

标签: python

我对python编程很陌生,所以请大家简单回答一下。

我有一个.raw文件,它是2b / 2b复杂的短整数格式。它实际上是一个二维光栅文件。我想阅读和分离真实和复杂的部分。可以说光栅的大小是[MxN]。

如果问题不明确,请告诉我。

干杯 Ñ

1 个答案:

答案 0 :(得分:2)

您可以使用struct模块执行此操作。这是一个基于您在评论中提到的文件格式信息的简单示例:

import struct

def read_complex_array(filename, M, N):
    row_fmt = '={}h'.format(N)  # "=" prefix means integers in native byte-order
    row_len = struct.calcsize(row_fmt)
    result = []
    with open(filename, "rb" ) as input:
        for col in xrange(M):
            reals = struct.unpack(row_fmt, input.read(row_len))
            imags = struct.unpack(row_fmt, input.read(row_len))
            cmplx = [complex(r,i) for r,i in zip(reals, imags)]
            result.append(cmplx)
    return result

这将返回一个复数列表的列表,从我运行的一个简单测试的输出中可以看出:

[
  [  0.0+  1.0j    1.0+  2.0j    2.0+  3.0j    3.0+  4.0j],
  [256.0+257.0j  257.0+258.0j  258.0+259.0j  259.0+260.0j],
  [512.0+513.0j  513.0+514.0j  514.0+515.0j  515.0+516.0j]
]

Python中复数的实部和虚部通常表示为一对机器级双精度浮点数。

您也可以使用array模块。这是使用它的相同事情:

import array

def read_complex_array2(filename, M, N):
    result = []
    with open(filename, "rb" ) as input:
        for col in xrange(M):
            reals = array.array('h')
            reals.fromfile(input, N)
            # reals.byteswap()  # if necessary
            imags = array.array('h')
            imags.fromfile(input, N)
            # imags.byteswap()  # if necessary
            cmplx = [complex(r,i) for r,i in zip(reals, imags)]
            result.append(cmplx)
    return result

正如你所看到的,它们非常相似,所以不清楚使用一个优于另一个是一个很大的优势。我怀疑基于array的版本可能会更快,但这必须通过实际计算一些真实数据来确定,以便能够肯定地说出来。