【问题标题】:Reading binary file with specific sequence in Python在Python中读取具有特定序列的二进制文件
【发布时间】:2016-12-17 19:59:19
【问题描述】:

我有一些具有特定序列的32x32x8192 二进制数据文件,我想知道。
我如何在Python 3x. 中读取它该文件由Nx × Ny × Nz 数字(浮点单精度)组成。
数字顺序对应indexes x, y and z,分别从1 to Nx, Ny and Nz依次递增。
变化最快的索引是z,其次是y,变化最慢的索引是x
也就是说,序列中的第一个Nz 数字对应于索引x = 1, y = 1,并且z1 to Nz 增加。

np.fromfile("turbine_32x32x8192.bin", dtype=float, count=10, sep="")的数据样本:

[ -8.26325563e+02  -7.41263867e+00  -1.52541103e+01  -1.83999292e+03
  -7.53629982e+03  -3.43120688e+05  -1.88674962e+04  -1.81482768e+00
  -4.13878029e+03  -8.29483377e+05] 

【问题讨论】:

  • 好的。你对此做了什么?您是否有想要使用的包,例如numpy?你知道如何将文件读入你选择的包中吗?您是否尝试自己实现它?如果这些问题中的任何一个的答案是否定的,请继续努力,真正陷入困境然后问。开始新事物是令人生畏的,但事情相当容易。
  • 我已经阅读了文件:np.fromfile("turbine_32x32x8192.bin", dtype=float, count=-1, sep="")。但我想创建一个包含 3 列的格式,每列分别命名为 Nx、Ny 和 Nz,可能在 pandas 数据框中。
  • 好的。您文件中的数据如何?根据您的问题,我假设您有 Nx 个文件,每个文件都有 Nz x Ny 行和列。如果是这种情况,您将不得不在循环中读取数据并随时追加。尝试使用np.zeros((Nx, Ny, Nz)) 作为初始化矩阵。读取一个文件,并将其存储在数组中,循环中一次一个Nx
  • 如果你想在 pandas 中阅读它,你仍然需要一个循环。但是,我不知道可以读取二进制文件的 pandas 方法,除非它是 csv 二进制文件。如果它基于 csv,您可以尝试 [pd.read_csv(file) for file in files] 获取包含所有文件的 DataFrame 列表。这个列表,你可以convert to a Panel 或者你可以concatenate 得到一个更大的DataFrame 将所有的值都放在里面。
  • 读取二进制文件时,它不是结构化的,只是一个列表。

标签: python pandas numpy binary


【解决方案1】:
import struct

data = open(filename, 'rb').read()

def chunk(i, j):
    at = i * 32 + j
    return data[at * (8192 * 4) : (at + 1) * (8192 * 4)]

a = [list(struct.unpack('8192f', chunk(i, j))) for i in range(32) for j in range(32)]

结果将在a

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    相关资源
    最近更新 更多