当读取使用tofile生成的二进制文件时,Python fromfile返回不正确的值

时间:2011-06-01 08:38:18

标签: python numpy binary-data

我发现了几个类似的问题,但没有一个完全描述我面临的问题。我有一个OBJ文件,其中包含描述顶点位置的行:

v 0.01214 0.4242 0.82874

我想将这些数据转换为matlab友好格式,以便我可以使用从其他文件中获取的这些和其他值来绘制一些数据。我正在使用python(和numpy)将这些数据转换为二进制文件,因此我使用以下函数:

def extract_verts(in_file, out_file):
    v = np.zeros(3, np.float32)
    for line in in_file:
        words = line.split()
        if words[0] == 'v':
           v[:] = [np.float32(s) for s in words[1:4]]
           print v[:]
           v.tofile(out_file)

问题在于,当我使用matlab读取它(fread完成工作)时,第一个值是正确的,但是读取了不正确的值。在一些不正确的值之后,再次读取正确的值,但它们似乎被移位(例如,当使用向量-3结构时,x分量显示为y分量)。之后,它再次发生并且不正确然后更正,但是读取了移位的值,依此类推。我已经检查过文件是否正确读取,因为我可以看到打印行的读取值。

我试过用python读取文件,以防它是一个matlab问题:

data = np.fromfile('file.dat', np.float32)
i = 0
while i < 100:
     print data[i]
     i = i+1

并且它完全相同(即使不正确的值相同)。

我认为它可能与字节排序或操作系统相关的问题有关,因为我正在使用的这组脚本适用于MacOS(脚本是由同事创建的),但我使用的是Windows 7.有人在过去遇到过类似的问题吗?

感谢。

1 个答案:

答案 0 :(得分:1)

最有可能的是,错误出现在您不会显示的代码中。 out_file extract_verts()参数似乎是一个打开的文件对象,以二进制模式打开此文件非常重要:

out_file = open("out.dat", "wb")

默认情况下,文件以文本模式打开。在Windows上,这意味着会发生自动换行:字节'\n'的所有出现都被'\r\n'替换。这就是为什么直到'\n'第一次出现的所有值都是正确的。