Python Windows上的软件无法读取使用tobytes()写入二进制数据

Python Windows上的软件无法读取使用tobytes()写入二进制数据,python,pandas,numpy,binary,point-clouds,Python,Pandas,Numpy,Binary,Point Clouds,我正在尝试使用python将一些xyz点数据写入.ply文件 我在这里使用的脚本基本上是通过recarry和numpy方法将pandas数据帧写入二进制格式tobytes(): 这个脚本在我的Mac电脑上运行良好,CloudCompare等软件可以读取它;然而,当我在windows机器上使用相同的脚本时,CloudCompare可以读取标题信息,但会对二进制内容进行加码 当我将文本文件版本读入CloudCompare并作为二进制文件输出时,Linux和Windows版本都可以读取它,但文件内容不

我正在尝试使用python将一些xyz点数据写入.ply文件

我在这里使用的脚本基本上是通过recarry和numpy方法将pandas数据帧写入二进制格式
tobytes()

这个脚本在我的Mac电脑上运行良好,CloudCompare等软件可以读取它;然而,当我在windows机器上使用相同的脚本时,CloudCompare可以读取标题信息,但会对二进制内容进行加码

当我将文本文件版本读入CloudCompare并作为二进制文件输出时,Linux和Windows版本都可以读取它,但文件内容不同


是由上述脚本生成的版本,是由CloudCompare在Windows上生成的版本,是原始数据。

使用_code.ply制作的与使用_Windows.ply制作的之间的区别在于,在后者中,所有小数都四舍五入为2位小数,正如您可以看到的:

with open('windows.ply', 'rb') as f:
    np.core.records.fromfile(f, formats='f4,f4,f4,f4')
在使用
tail提取数据部分后-c+274使用_windows.ply>windows.ply制作

以下代码生成的文件(在数据部分)与使用windows.ply制作的文件相同:

import pandas as pd
import numpy as np

pc = pd.read_csv('points.txt')

with open('made_with_code_new.ply', 'wb') as ply:
    ply.write("ply\n")
    ply.write('format binary_little_endian 1.0\n')
    ply.write("comment Author: Phil Wilkes\n")
    ply.write("obj_info generated with pcd2ply.py\n")
    ply.write("element vertex {}\n".format(len(pc)))
    ply.write("property float x\n")
    ply.write("property float y\n")
    ply.write("property float z\n")
    ply.write("end_header\n")

    pc[['x', 'y', 'z', 'n']] = pc[['x', 'y', 'z', 'n']].round(2).astype('f4')

    ply.write(pc[['x', 'y', 'z', 'n']].to_records(index=False).tobytes())

我需要指定打开文件时要使用的行尾:

open(output_name, 'w', newline='\n')
在为Python 3重写后,必须将文件写入两次—一次写入头,一次写入二进制组件,因此新函数如下所示:

import pandas as pd
import numpy as np

pc = pd.read_csv('points.txt')

with open(output_name, 'w', newline='\n') as ply:

    ply.write("ply\n")
    ply.write('format binary_little_endian 1.0\n')
    ply.write("comment Author: Phil Wilkes\n")
    ply.write("obj_info generated with pcd2ply.py\n")
    ply.write("element vertex {}\n".format(len(pc)))
    ply.write("property float x\n")
    ply.write("property float y\n")
    ply.write("property float z\n")
    ply.write("end_header\n")

with open(output_name, 'ab') as ply:
    pc[['x', 'y', 'z']] = pc[['x', 'y', 'z']].astype('f4')
    ply.write(pc[cols].to_records(index=False).tobytes()) 

如何使用列表作为索引?
pc
是某种自定义类型,可以使用索引值进行秘密操作吗?我使用下载的数据将代码更新为一个完整的示例
pc
是一个数据帧,列表索引
pc
中的列。
import pandas as pd
import numpy as np

pc = pd.read_csv('points.txt')

with open(output_name, 'w', newline='\n') as ply:

    ply.write("ply\n")
    ply.write('format binary_little_endian 1.0\n')
    ply.write("comment Author: Phil Wilkes\n")
    ply.write("obj_info generated with pcd2ply.py\n")
    ply.write("element vertex {}\n".format(len(pc)))
    ply.write("property float x\n")
    ply.write("property float y\n")
    ply.write("property float z\n")
    ply.write("end_header\n")

with open(output_name, 'ab') as ply:
    pc[['x', 'y', 'z']] = pc[['x', 'y', 'z']].astype('f4')
    ply.write(pc[cols].to_records(index=False).tobytes())