ValueError: invalid literal for int() with base 10: ‘1/1‘

问题描述

在obj文件转化为pcb文件的代码中,需要先读取obj文件,在f(面face)行中数据格式为:
f Vertex1/Texture1/Normal1 Vertex2/Texture2/Normal2 Vertex3/Texture3/Normal3
属于这个面的顶点、纹理坐标和法向量的索引号,整数,也就是以上顶点、纹理坐标和法向量的顺序。这里使用的obj文件中f只含有其中两个坐标的信息,也就是
f Vertex1/Texture1 Vertex2/Texture2 Vertex3/Texture3,所以会出现‘1/1‘

定位错误代码

if strs[0] == "f":
    faces.append((int(strs[1]), int(strs[2]), int(strs[3])))

报错的大致意思是字符串‘1/1’不能转化为int型数据,出现这种错误的原因大概是搬运的这个代码所使用的obj文件中f只有一个数字,也就是只有顶点坐标;而我使用的obj文件不仅有顶点索引号,还有纹理坐标、法向量等信息。

解决方法

看了网上的方法,大都是说要先把str转化为float,然后再int(),试了之后发现会报类似的错误:ValueError: could not convert string to float: ‘1/1’

一个可以消除错误的处理方式是:

if strs[0] == "f":
    faces.append((int(eval(strs[1])), int(eval(strs[2])), int(eval(strs[3]))))

虽然这样可以消除error,但是会得到错误的结果:eval函数的功能是执行一个字符串表达式,并返回表达式的值,这里的字符串会被当成表达式处理,也就是序号相除得到一个数值,但这并不是我们期望提取的数据。

因此正确的解决方式就是只提取第一个数字,也就是顶点序号:

faces.append((int(strs[1].split('/')[0]), int(strs[2].split('/')[0]), int(strs[3].split('/')[0])))

借助split字符串分割函数,over。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值