Python fromfile在读取用tofile生成的二进制文件时返回错误的值



我发现了几个类似的问题,但没有一个能准确描述我面临的问题。我有一个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上运行(脚本是由一位同事创建的),但我使用的是Windows7。过去有人遇到过类似的问题吗?

谢谢。

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

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

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

相关内容

最新更新