Python Windows上的软件无法读取使用tobytes()写入二进制数据
我正在尝试使用python将一些xyz点数据写入.ply文件 我在这里使用的脚本基本上是通过recarry和numpy方法将pandas数据帧写入二进制格式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版本都可以读取它,但文件内容不
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())