Python 从字符串中获取浮点值

Python 从字符串中获取浮点值,python,text,blender,Python,Text,Blender,我想用Python在Blender中制作一个对象编码器,从文本文档中读取值(坐标),结构如下: p(-9,-8,27) p(-9,-23,27) p(-7,-24,63) p(-7,-11,63) 如何使'p('和')在代码中消失,以便int转换成功 到目前为止,我写过: with open(filepath, 'r') as file: for line in file: words = line.split('(') if len(words) == 0 or word

我想用Python在Blender中制作一个对象编码器,从文本文档中读取值(坐标),结构如下:

p(-9,-8,27)
p(-9,-23,27) 
p(-7,-24,63) 
p(-7,-11,63)
如何使
'p('
')
在代码中消失,以便
int
转换成功

到目前为止,我写过:

with open(filepath, 'r') as file:
for line in file:
    words = line.split('(')
    if len(words) == 0 or words[0].startswith('/'):
        pass
    elif words[0] == 'p':
        words[0].replace('p','')
        words[1].replace(')','')
        pos = words[0].split(',')
        print(pos)
        x, y, z = float(pos[0]), float(pos[1]), float(pos[2])
        mesh.verts.append(Blender.NMesh.Vert(x, y, z))
        print(x, y, z)
我得到的错误是:

ValueError: could not convert string to float: 'p'
str.replace();
单词
值不受影响

我将使用
str.strip()
从行中删除
p
和括号:

for line in file:
    if not line.startswith('p'):
        continue  # skip these lines
    words = line.strip('\np()').split(',')
    x, y, z = map(float, words)
    mesh.verts.append(Blender.NMesh.Vert(x, y, z))
在这里,我们跳过开头没有
p
的任何行,
str.strip()
从字符串的开头和结尾删除参数中的任何字符;因此,从开始和结束处删除任何
p
字符(以及从文件中读取行时始终存在的换行符):


如果您知道它总是以p开头(以p结尾),您可以这样做:

for line in file:
    coords = [float(c) for c in line.strip()[2:-1].split(',')]
    mesh.verts.append(Blender.NMesh.Vert(*coords))

第[2:-1]行是一种切片表示法,它跳过了前两个字符和最后一个字符(这样
“(p(x,y,z)”
变成
“x,y,z”
)。然后,它被拆分()以获得字符串数组
[“x”,“y”,“z”]
。然后,“对于该数组中的每个坐标,给我一个浮点(坐标)”,将是“浮点(c)”的英文翻译对于c-in-line…

regex更适合于此,但考虑到可能会有一个换行符(最后一行并不总是在末尾有换行符,所有其他行都会有换行符)。@Joe你能解释一下c-in-line[2:-1]的
是什么吗
-部分是吗?我得到一个错误,脚本无法将字符串转换为浮点,因为末尾仍然有一个
。@McMidas我在文章中添加了其他解释。您的错误意味着
不会被
[:-1]
删除,因为行中有多余的字符。Martijn的答案通过从行中删除所有p、(,)和\n来解决这个问题。我也修改了我的答案以支持它(不带参数的split()将处理\n、空格和其他您不需要的奇怪字符),谢谢您的回复。这将仅在所有线都包含坐标时运行。抱歉问得不准确。如果没有任何“p”作为起始字符,脚本如何跳过该行?如果不是单词或不是单词[0]。开始使用('p'):继续#跳过此行不起作用。我可以问一下为什么你的话中有两个数组吗?Thanks@McMidas:对不起,我错了;带有显式参数的拆分总是导致字符串(即使是空字符串);更正
words
是字符串列表;字符串也可以被索引。所以
单词[0][0]
是第一个元素(字符串),第一个字符。好的,我明白了。但是现在
如果没有单词或没有单词[0][0]='p':
不起作用,有一个索引器:
字符串索引超出范围
@McMidas:如果要检查
p
,请在剥离之前检查<代码>如果不是单词。开始使用('p'):继续,例如,第一行可以这样做。您是否这样做:
使用open(filepath,'r')作为文件:对于文件中的行:如果不是单词或不是单词[0][0]='p':继续#跳过此行单词=行。strip('\np()')。拆分(','))打印(单词)
但您在声明之前调用“单词”。
for line in file:
    coords = [float(c) for c in line.strip()[2:-1].split(',')]
    mesh.verts.append(Blender.NMesh.Vert(*coords))