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可以完成这个任务),最开始的值是正确的,但接下来读取到的值就不对了。然后又有一些正确的值被读取,但它们似乎是错位的(比如在使用三维向量结构时,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 个回答
1
很可能,错误出在你没有展示的代码上。extract_verts()
函数中的 out_file
参数看起来是一个打开的文件对象,而你需要确保这个文件是以二进制模式打开的:
out_file = open("out.dat", "wb")
默认情况下,文件是以文本模式打开的。在Windows系统上,这意味着会自动处理换行符:所有的 '\n'
字节都会被替换成 '\r\n'
。这就是为什么在第一个 '\n'
出现之前的所有值都是正确的原因。