如何正确选择所需数据并从二进制文件中丢弃不需要的数据

时间:2018-08-14 06:04:03

标签: numpy binary python-3.6 data-conversion

我正在一个项目中尝试将旧的16位二进制数据文件转换为32位数据文件以供以后使用。

直接转换没有问题,但是后来我注意到我需要从数据文件的文件头中删除标头数据。

数据由 8206字节长的帧组成,每帧由 14字节长的标头和4096字节长的数据块组成,具体取决于文件,有<每个文件中的strong> 70313 或 70312 框架。

我找不到找到所有标题并将其删除并将仅数据块保存到新文件的巧妙方法。

这就是我所做的:

results_array = np.empty([0,1], np.uint16)

for filename in file_list:
    num_files += 1
    # read data from file as 16bit's and save it as 32bit
    data16 = np.fromfile(data_dir + "/" + filename, dtype=np.uint16)
    filesize = np.prod(data16.shape)
    if filesize == 288494239:
        total_frames = 70313
        #total_frames = 3000
    else:
        total_frames = 70312
        #total_frames = 3000

    frame_count = 0
    chunksize = 4103

    with open(data_dir + "/" + filename, 'rb') as file:
        while frame_count < total_frames:
            frame_count += 1
            read_data = file.read(chunksize)
            if not read_data:
                break
            data = read_data[7:4103]
            results_array = np.append(results_array,data)
            converted = np.frombuffer(results_array, np.uint16)
            print(str(frame_count) + "/" + str(total_frames))

        converted = np.frombuffer(results_array, np.uint16)
        data32 = converted.astype(dtype=np.uint32) * 256

它有效(我认为它至少可以做到),但是它非常慢。

问题是,有没有一种方法可以更快地完成上述操作,也许是numpy中的一些内置函数或其他一些东西?

预先感谢

1 个答案:

答案 0 :(得分:0)

最终成功破解了它,它比最初的方法快100倍:)

    data = np.fromfile(read_dir + "/" + file, dtype=np.int16)
    frames = len(data) // 4103 # framelenght

    # Reshape into array such that each row is a frame
    data = np.reshape(data[:frames * 4103], (frames, 4103))

    # Remove headers and convert to int32
    data = data[:, 7:].astype(np.int32) * 256