读取.obj文件和分割线

时间:2016-09-20 00:35:12

标签: python python-3.x

我制作了一个简单的代码来读取看起来像这样的.obj文件

g cube

v  0.0  0.0  0.0
v  0.0  0.0  1.0
v  0.0  1.0  0.0
v  0.0  1.0  1.0
v  1.0  0.0  0.0
v  1.0  0.0  1.0
v  1.0  1.0  0.0
v  1.0  1.0  1.0

f  1//2  7//2  5//2
f  1//2  3//2  7//2 
f  1//6  4//6  3//6 
f  1//6  2//6  4//6 
f  3//3  8//3  7//3 
f  3//3  4//3  8//3 
f  5//5  7//5  8//5 
f  5//5  8//5  6//5 
f  1//4  5//4  6//4 
f  1//4  6//4  2//4 
f  2//1  6//1  8//1 
f  2//1  8//1  4//1 

python代码看起来像这样

class objeto():
def __init__(self, obj = None):
    if obj:
        self.cargar_obj(obj)

def cargar_obj(self, archivo):
    with open(archivo, 'r') as obj:
        datos = obj.read()

    lineas = datos.splitlines()
    self.vertices = []
    self.superficies = []

    for linea in lineas:
        elem = linea.split()
        if elem:
            if elem[0] == 'v':
                v = vertice(float(elem[1]), float(elem[2]), float(elem[3]))
                self.vertices.append(v)
            elif elem[0] == 'f':
                vs = []
                for i in range(1, len(elem)):
                    vs.append(self.vertices[int(elem[i].split('/'))])

                f = cara(vs)
                self.superficies.append(f)
            else:
                pass

问题似乎是这一行:

vs.append(self.vertices[int(elem[i].split('/'))])

因为当我尝试运行代码时,出现后面的TypeError

int() argument must be a string, a bytes-like object or a number, not 'list'

我是Python的新手,所以我似乎无法解决这个错误,有人可以给我一些建议吗?感谢。

我使用Python 3.x和ipython运行.py文件

2 个答案:

答案 0 :(得分:1)

用一行重新创建案例:

In [435]: line='f  1//2  7//2  5//2'
In [436]: elem = line.split()
In [437]: elem
Out[437]: ['f', '1//2', '7//2', '5//2']
In [438]: elem[0]
Out[438]: 'f'

分割在/上的行为符合我的预期:

In [439]: for i in range(1,len(elem)):
     ...:    print(elem[i].split('/'))
     ...:    
['1', '', '2']
['7', '', '2']
['5', '', '2']

您的代码在将int应用于字符串列表时遇到问题:

In [440]: for i in range(1,len(elem)):
     ...:    print(int(elem[i].split('/')))
     ...
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

因此我们需要将int()应用于单个字符串,而不是列表。但现在空字符串给我带来了麻烦。

In [441]: for i in range(1,len(elem)):
     ...:    print([int(e) for e in elem[i].split('/')])
     ...:        
ValueError: invalid literal for int() with base 10: ''

其余部分留给读者练习。

无法抗拒:

[int(e) for e in elem[i].replace('//','/').split('/')]
[int(e) for e in elem[i].split('/') if e]

答案 1 :(得分:0)

错误消息非常清楚:您正在传递int列表(调用split的结果);也许你只是想用这个列表中的一个元素来调用它。