首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用拼接文件的Plydata.read读取ASCII ply文件时的AttributeError

用拼接文件的Plydata.read读取ASCII ply文件时的AttributeError
EN

Stack Overflow用户
提问于 2020-08-10 23:32:24
回答 2查看 268关注 0票数 1

我正在尝试编写一个简短的脚本,将包含点坐标的文本文件转换为二进制ply文件。其想法是在开头添加一个头文件,将文件类型更改为ASCII ply,然后使用plyfile读取它并写入二进制ply。我可以使用CloudCompare或Meshlab手动完成此操作,但我有几千个文件需要转换。

我有一个可以用CloudCompare打开的ASCII文件,但是当我尝试使用PlyData.read时,我得到了一个AttributeError。当我尝试在直接从CloudCompare保存的文件上运行它时,我得到了相同的错误。

下面是我为了调试而减少的代码:

代码语言:javascript
运行
复制
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')

下面是我在运行它时得到的错误

代码语言:javascript
运行
复制
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'
EN

回答 2

Stack Overflow用户

发布于 2020-08-11 02:49:26

如果您的任务只是将多个文件从ply ascii转换为ply二进制文件,您可以使用meshlabserver,这是meshlab的命令行版本,它是可脚本化的,非常适合这种任务。

此外,如果你觉得自己真的很勇敢,你甚至可以尝试即将到来的pymeshlab ( https://github.com/cnr-isti-vclab/PyMeshLab ),例如python绑定,用于所有的meshlab功能;目前(2020年8月)它处于非常阿尔法的状态,但几乎已经可以使用了……

票数 1
EN

Stack Overflow用户

发布于 2020-08-11 23:56:33

这并没有直接回答关于AttributeError的问题,但是我能够通过自己将文件解析成numpy数组来解决这个问题。最终结果如下所示:

代码语言:javascript
运行
复制
#!/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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63343286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档