【发布时间】:2017-02-12 18:10:57
【问题描述】:
我有一个在 Fortran 中创建的二进制文件,其中包含作为记录的整数值。我想将这些读入 Python,将它们编辑为列表并将它们作为 np-arrays 保存回二进制文件。然而,出于某种原因,Python 在文件中的每条记录之后插入了一个额外的“0”。我想这就是他们所说的“填充”,对吧?我该如何抑制这个?
这是一个独立的例子:
import numpy as np
content = np.array(range(20))
# Write:
with open('D:/bin_test.dat', 'wb') as write_binary:
write_binary.writelines(content)
# Read:
with open('D:/bin_test.dat', 'rb') as read_binary:
content = np.fromfile(read_binary, dtype=np.int16)
print content
Out:
[ 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11
0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0]
如果我通过np.fromfile 读取 Fortran 二进制文件并将其直接保存回二进制文件,它就可以正常工作。这就是为什么我猜从列表转换为numpy数组后会出现问题。
谢谢!
【问题讨论】:
-
我没有 Python 2.7(并且该代码在 Python 2.6 上无法运行),但在 Python 3.6 上,如果您将数据类型更改为
dtype=np.int32,您的代码就会执行您想要的操作。跨度> -
检查
content.dtype。貌似是np.int32,一般是Windows上默认的整数类型。您正在编写 32 位整数,但随后尝试将它们作为 16 位整数读回。所以结果中的所有其他值都是 0。 -
有时就这么简单...是的,我一直在尝试通过在 Fortran 中使用 16 位整数来节省硬盘空间,但没有意识到 numpy 默认创建 int32 数组。嗯,好的,问题解决了。谢谢!
-
好的,我会添加我的评论作为答案。
标签: python python-2.7 numpy io binary