我正在尝试编写一个简短的脚本,将包含点坐标的文本文件转换为二进制ply文件。其想法是在开头添加一个头文件,将文件类型更改为ASCII ply,然后使用plyfile读取它并写入二进制ply。我可以使用CloudCompare或Meshlab手动完成此操作,但我有几千个文件需要转换。
我有一个可以用CloudCompare打开的ASCII文件,但是当我尝试使用PlyData.read时,我得到了一个AttributeError。当我尝试在直接从CloudCompare保存的文件上运行它时,我得到了相同的错误。
下面是我为了调试而减少的代码:
import os
from glob import glob
from plyfile import PlyData, PlyElement
if __name__ == '__main__':
#Request input if no system arguments found
try:
inputDirName = sys.argv[1]
except IndexError:
inputDirName = input('Enter directory containing ASCII ply files:\n')
os.chdir(inputDirName)
files = glob('*.ply')
for file in files:
with open(file, 'r+') as f:
data = PlyData.read(f)
PlyData([data]).write(file.split('.')[0] + '_binary.ply')
下面是我在运行它时得到的错误
File "C:\Users\user\Miniconda3\lib\site-packages\plyfile.py", line 392, in read
data = PlyData._parse_header(stream)
File "C:\Users\user\Miniconda3\lib\site-packages\plyfile.py", line 373, in _parse_header
while parser.consume(stream.readline()):
File "C:\Users\user\Miniconda3\lib\site-packages\plyfile.py", line 120, in consume
line = raw_line.decode('ascii').strip()
AttributeError: 'str' object has no attribute 'decode'
发布于 2020-08-11 02:49:26
如果您的任务只是将多个文件从ply ascii转换为ply二进制文件,您可以使用meshlabserver,这是meshlab的命令行版本,它是可脚本化的,非常适合这种任务。
此外,如果你觉得自己真的很勇敢,你甚至可以尝试即将到来的pymeshlab ( https://github.com/cnr-isti-vclab/PyMeshLab ),例如python绑定,用于所有的meshlab功能;目前(2020年8月)它处于非常阿尔法的状态,但几乎已经可以使用了……
发布于 2020-08-11 23:56:33
这并没有直接回答关于AttributeError的问题,但是我能够通过自己将文件解析成numpy数组来解决这个问题。最终结果如下所示:
#!/usr/bin/env python
import os
import sys
import numpy as np
from datetime import datetime
from glob import glob
from plyfile import PlyData, PlyElement
if __name__ == '__main__':
#Request input if no system arguments found
try:
inputDirName = sys.argv[1]
except IndexError:
inputDirName = input('Enter directory containing files to be converted:\n')
os.chdir(inputDirName)
files = glob('*.txt')
for file in files:
with open(file, 'r+') as f:
# Get number of vertices
vertices = int(f.readline())
# Create empty numpy array and define datatypes
numpyArray = np.empty(vertices,dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4'),
('red', 'u1'), ('green', 'u1'), ('blue', 'u1')])
# Read file contents into array
for index, line in enumerate(f):
x, y, z, r, g, b = line.strip().split(' ')
numpyArray[index] = (x, y, z, r, g, b)
# Create PlyElement instance
el = PlyElement.describe(numpyArray, 'vertex',
comments=['Created ' + str(datetime.now())])
# Write to binary ply file
binaryFile = file.split('.')[0] + '_binary.ply'
PlyData([el]).write(binaryFile)
print('Saved ' + binaryFile)
https://stackoverflow.com/questions/63343286
复制相似问题