【问题标题】:Getting wrong zero values with numpy fromfile when reading binary files读取二进制文件时使用 numpy fromfile 获取错误的零值
【发布时间】:2014-09-20 04:05:55
【问题描述】:

我正在尝试使用 Python 读取二进制文件。这是我使用的代码:

fb = open(Bin_File, "r")
a = numpy.fromfile(fb, dtype=numpy.float32)

但是,我在数组末尾得到零值。例如,对于nrows=296ncol=439 以及因此len(a)=296*439 的情况,我得到a[-922:] 的零值。我知道这些值应该是来自 R 中一段受信任代码的 noData(本例中为 -9999)。有人知道我为什么会得到这些无意义的零吗?

P.S:我不确定它是否相关,但len(a)nrows*ncols+2!我必须使用a = a[0:-2] 删除这两个,这样当我使用a_reshape = a.reshape(nrows, ncols) 将它们重新整形为行和列时,我不会收到错误。

【问题讨论】:

  • 尝试使用"rb" 标签打开而不是"r" ?
  • hmmm,你可能应该用 R 标签标记这个问题,并发布你的 R 读取命令或实际编写文件的代码。
  • 可能是编写该文件的软件在原始二进制文件之外添加了 2 个额外字段?我知道(默认情况下)Fortran 90 添加了两个块来指示有多少数据。
  • @Gabriel 使用"rb" 而不是"r" 解决了所有问题。 numpy 数组现在完全有意义。您介意将您的评论移至回答以便我投票吗?
  • 添加了答案和一些解释

标签: numpy binary ascii fromfile


【解决方案1】:

当打开文件以二进制形式读取时,您应该使用模式"rb" 而不是"r"

这是docs 的一些背景信息。在 linux 机器上,您不需要"b",但它不会受到伤害。在 Windows 机器上,二进制文件必须使用 "rb"

另请注意,当您使用 Fortran 的“未格式化”二进制输出格式时,您获得的两个额外条目是常见的错误/功能。在这种模式下给出的每个写语句都会产生一个被两个 4 字节块包围的记录。

这些块表示整数,列出未格式化数据块中的字节数。例如,[223] [223 字节数据] [223]。

【讨论】:

  • 太棒了!它完全奏效了。使用"rb" 而不是"b" 解决了无意义零的问题。二进制代码是使用 Fortran 创建的,它仍然比您提到的 ncols*nrows 多两个数字。我用a = a[0:-2] 摆脱了它们。
  • 谢谢,点击左侧绿色箭头即可接受答案。
  • 实际上,小心删除最后两个。 Fortran 将在开头添加一个 4 字节的 int,在末尾添加一个。这些指示数据块有多大,可用于验证。你可能想要a = a[1:-1]
  • 这是一个很好的观点。我检查了二进制文件,似乎a[0]a[-1] 有两个非常小的数字。使用a = a[1:-1] 是要走的路。