我对python编程相当陌生,所以请简单回答一下。
我有一个 .raw 文件,它是 2b/2b 复杂的短整数格式。它实际上是一个二维光栅文件。我想阅读和分离真实和复杂的部分。假设栅格是 [MxN] 大小。
如果问题不清楚,请告诉我。
干杯 N
我对python编程相当陌生,所以请简单回答一下。
我有一个 .raw 文件,它是 2b/2b 复杂的短整数格式。它实际上是一个二维光栅文件。我想阅读和分离真实和复杂的部分。假设栅格是 [MxN] 大小。
如果问题不清楚,请告诉我。
干杯 N
你可以用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
基于版本的版本可能会更快,但这必须通过使用一些真实数据实际计时来确定,以便能够确定地说。
看看Hachoir图书馆。它是为此目的而设计的,并且它的工作非常好。