这是一个二进制文件,具有非常简单的结构用于学习目的。每个寄存器有3个数字:32位浮点数,64位浮点数和另一个32位浮点数。如果我以十六进制的形式将其转储到屏幕上,它看起来像这样:
0000000: 0800 0000 0000 0000 0000 0000 0800 0000 ................
0000010: 0800 0000 0000 0000 0000 f03f 0800 0000 ...........?....
0000020: 0800 0000 182d 4454 fb21 0940 0800 0000 .....-DT.!.@....
(...)
如果我以二进制格式手动复制第三行,我可以将其读入三个变量:
import struct
data = b'\x08\x00\x00\x00\x18-DT\xfb!\t@\x08\x00\x00\x00'
l1, value, l2 = struct.unpack("<idi", data)
# (8, 3.141592653589793, 8)
这有效,但我需要从磁盘读取文件,而不仅仅是手动复制二进制文件中的每个寄存器,因为我需要用数百万个数据来完成。我需要与ascii文件中使用的以下命令等效的东西:
l1, value, l2 = pylab.loadtxt('./test_file.binary',unpack=True)
这里不起作用。
答案 0 :(得分:3)
以二进制模式读取文件:
def read_stuff(fname='test_file.binary'):
with open(fname, mode='rb') as f:
while True:
data = f.read(16)
if len(data) < 16:
# end of file
return
yield struct.unpack("<idi", data)
这是一台发电机。消费它:
for l1, value, l2 in read_stuff():
...
答案 1 :(得分:0)
您可以尝试此方法
# includes core parts of numpy, matplotlib
import matplotlib.pyplot as plt
import numpy as np
# include scipy's signal processing functions
import scipy.signal as signal
# practice reading in complex values stored in a file
# Read in data that has been stored as raw I/Q interleaved 32-bit float samples
dat = np.fromfile("iqsamples.float32", dtype="float32")
# Look at the data. Is it complex?
dat = dat[0::2] + 1j*dat[1::2]
print(type(dat))
print(dat)
# # Plot the spectogram of this data
plt.specgram(dat, NFFT=1024, Fs=1000000)
plt.title("PSD of 'signal' loaded from file")
plt.xlabel("Time")
plt.ylabel("Frequency")
plt.show() # if you've done this right, you should see a fun surprise here!