簡體   English   中英

讀取.obj文件和分割線

[英]Reading .obj file and split lines

我編寫了一個簡單的代碼來讀取看起來像這樣的.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文件

用一行重新創建您的案例:

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]

錯誤消息非常清楚:您正在向int傳遞一個列表(調用split的結果); 也許您只是想用該列表的元素之一來調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM