我制作了一个简单的代码来读取看起来像这样的.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文件
答案 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
的结果);也许你只是想用这个列表中的一个元素来调用它。