Python,要浮动的负数字符串
这是一个非常简单的问题,但我正在使其变得不必要的复杂,并继续遇到障碍 我试图解析一个简单的文本文件,其中包含点云信息x,y,z 看起来是这样的:Python,要浮动的负数字符串,python,python-2.7,point-clouds,blender-2.67,Python,Python 2.7,Point Clouds,Blender 2.67,这是一个非常简单的问题,但我正在使其变得不必要的复杂,并继续遇到障碍 我试图解析一个简单的文本文件,其中包含点云信息x,y,z 看起来是这样的: vertices: v -543.243 -494.262 1282 v -538.79 -494.262 1282 v -536.422 -496.19 1287 v -531.951 -496.19 1287 v -527.481 -496.19 1287 v -213.909 -223.999 581 v -212.255 -224.384 58
vertices:
v -543.243 -494.262 1282
v -538.79 -494.262 1282
v -536.422 -496.19 1287
v -531.951 -496.19 1287
v -527.481 -496.19 1287
v -213.909 -223.999 581
v -212.255 -224.384 582
v -209.15 -223.228 579
v -207.855 -223.999 581
v -205.482 -223.613 580
v -203.468 -223.613 580
v -201.106 -223.228 579
v -199.439 -223.613 580
v -197.765 -223.999 581
v -195.41 -223.613 580
v -193.062 -223.228 579
v -190.721 -222.842 578
v -189.04 -223.228 579
v -187.998 -224.384 582
v -185.976 -224.384 582
v -183.955 -224.384 582
v -181.621 -223.999 581
v -179.293 -223.613 580
v -177.279 -223.613 580
v -175.264 -223.613 580
v -173.549 -223.999 581
v -171.531 -223.999 581
v -169.513 -223.999 581
v -167.495 -223.999 581
v -165.761 -224.384 582
v -163.74 -224.384 582
v -161.718 -224.384 582
v -159.697 -224.384 582
v -157.946 -224.77 583
v -155.921 -224.77 583
v -153.896 -224.77 583
v -151.871 -224.77 583
v -149.847 -224.77 583
v -147.568 -224.384 582
[[-543.243, -494.262, 1282.0],
[-538.79, -494.262, 1282.0],
[-536.422, -496.19, 1287.0],
[-531.951, -496.19, 1287.0],
[-527.481, -496.19, 1287.0],
[-213.909, -223.999, 581.0],
[-212.255, -224.384, 582.0],
[-209.15, -223.228, 579.0],
[-207.855, -223.999, 581.0],
[-205.482, -223.613, 580.0],
[-203.468, -223.613, 580.0],
[-201.106, -223.228, 579.0],
[-199.439, -223.613, 580.0],
[-197.765, -223.999, 581.0],
[-195.41, -223.613, 580.0],
[-193.062, -223.228, 579.0],
[-190.721, -222.842, 578.0],
[-189.04, -223.228, 579.0],
[-187.998, -224.384, 582.0],
[-185.976, -224.384, 582.0],
[-183.955, -224.384, 582.0],
[-181.621, -223.999, 581.0],
[-179.293, -223.613, 580.0],
[-177.279, -223.613, 580.0],
[-175.264, -223.613, 580.0],
[-173.549, -223.999, 581.0],
[-171.531, -223.999, 581.0],
[-169.513, -223.999, 581.0],
[-167.495, -223.999, 581.0],
[-165.761, -224.384, 582.0],
[-163.74, -224.384, 582.0],
[-161.718, -224.384, 582.0],
[-159.697, -224.384, 582.0],
[-157.946, -224.77, 583.0],
[-155.921, -224.77, 583.0],
[-153.896, -224.77, 583.0],
[-151.871, -224.77, 583.0],
[-149.847, -224.77, 583.0],
[-147.568, -224.384, 582.0]]
好的。还不错
接下来,我将在blender中使用python将这些点转换为顶点:
看起来是这样的:`
#Open the file
try:
f=open(path, 'r')
except:
print ("Path is not Valid")
#Create an array of
verts = []
#verts=[float(e) for e in verts if e]
#values = []
for line in f:
lines = f.readline()
#values = ([c for c in lines if c in '-1234567890.'])
if line.startswith("v "): #Go through file line by line
read = lines.strip(' v\n').split(',') #remove the v,split@,
#read = values.split(',')
#loop over all stuff in read, remove non-numerics
for d in read:
d= d.strip('-').split(' ')
print("d:", (d))
for n in d:
n = n.strip('-')
verts = verts.append(float(n[0]))
#verts = verts.append(float(n[2]))
#verts = verts.append(float(n[3]))
print("vertsloops", d[0])
print("read1", read[0])
print(read)
print("oo1verts", verts)
##################
#Extend the array#
#print ("Could not use the line reading: %s"%read)
# Create a new mesh, it is now empty
mesh = bpy.data.meshes.new("Cube")
# Create empty vertices field in the mesh
mesh.vertices.add(len(verts))
# Add vertices
mesh.vertices.foreach_set("co", verts)
#Add a new empty object named "Read the PointCloud Data"
obj = bpy.data.objects.new("Read the PointCloud Data", mesh)
# Link object to current scene
bpy.context.scene.objects.link(obj)
`
不知何故,我尝试了许多不同的组合来拆分字符串,但仍然会出错。我知道这是一项简单的任务!?!有什么建议吗
我首先看到的错误如下:
d: ['-536.422', '-496.19', '1287']
Traceback (most recent call last):
File "/Users/.../importpoints.blend/importpoints", line 37, in <module>
ValueError: could not convert string to float: '-'
Error: Python script fail, look in the console for now...
d:['-536.422','-496.19','1287']
回溯(最近一次呼叫最后一次):
文件“/Users/../importpoints.blend/importpoints”,第37行,在
ValueError:无法将字符串转换为浮点:'-'
错误:Python脚本失败,现在请查看控制台。。。
然后像这样:
d: ['536.422', '-496.19', '1287']
vertsloops 536.422
Traceback (most recent call last):
File "/Users/.../importpoints.blend/importpoints", line 37, in <module>
AttributeError: 'NoneType' object has no attribute 'append'
Error: Python script fail, look in the console for now...
d:['536.422','-496.19','1287']
Vertslops 536.422
回溯(最近一次呼叫最后一次):
文件“/Users/../importpoints.blend/importpoints”,第37行,在
AttributeError:“非类型”对象没有属性“附加”
错误:Python脚本失败,现在请查看控制台。。。
一件事是,为什么float('-531')不会作为负数处理。就目前而言,它点击了“-”标记,并认为它不是数字,因此无法转换它。但是它是否定的,那么我怎么能表示呢
谢谢。将一个负数字符串转换为浮点数没有问题
>>> float('-5.6')
-5.6
>>> float('-531')
-531.0
下面是一个解析一行的示例
>>> line = 'v -543.243 -494.262 1282'
>>> line.split()
['v', '-543.243', '-494.262', '1282']
>>> v, x, y, z = line.split()
>>> x
'-543.243'
>>> y
'-494.262'
>>> z
'1282'
现在我们转换为:
>>> x = float(x)
>>> x
-543.243
把你的阅读时间缩短一点:
verts = []
for line in f:
if line.startswith('v '):
verts.append([float(val) for val in line.split()[1:]])
这将替换f:循环中的行的完整。
确保文件中没有其他以v
开头的行。可能在值之后有一个空行,因此您可以停止读取
现在verts
看起来像这样:
vertices:
v -543.243 -494.262 1282
v -538.79 -494.262 1282
v -536.422 -496.19 1287
v -531.951 -496.19 1287
v -527.481 -496.19 1287
v -213.909 -223.999 581
v -212.255 -224.384 582
v -209.15 -223.228 579
v -207.855 -223.999 581
v -205.482 -223.613 580
v -203.468 -223.613 580
v -201.106 -223.228 579
v -199.439 -223.613 580
v -197.765 -223.999 581
v -195.41 -223.613 580
v -193.062 -223.228 579
v -190.721 -222.842 578
v -189.04 -223.228 579
v -187.998 -224.384 582
v -185.976 -224.384 582
v -183.955 -224.384 582
v -181.621 -223.999 581
v -179.293 -223.613 580
v -177.279 -223.613 580
v -175.264 -223.613 580
v -173.549 -223.999 581
v -171.531 -223.999 581
v -169.513 -223.999 581
v -167.495 -223.999 581
v -165.761 -224.384 582
v -163.74 -224.384 582
v -161.718 -224.384 582
v -159.697 -224.384 582
v -157.946 -224.77 583
v -155.921 -224.77 583
v -153.896 -224.77 583
v -151.871 -224.77 583
v -149.847 -224.77 583
v -147.568 -224.384 582
[[-543.243, -494.262, 1282.0],
[-538.79, -494.262, 1282.0],
[-536.422, -496.19, 1287.0],
[-531.951, -496.19, 1287.0],
[-527.481, -496.19, 1287.0],
[-213.909, -223.999, 581.0],
[-212.255, -224.384, 582.0],
[-209.15, -223.228, 579.0],
[-207.855, -223.999, 581.0],
[-205.482, -223.613, 580.0],
[-203.468, -223.613, 580.0],
[-201.106, -223.228, 579.0],
[-199.439, -223.613, 580.0],
[-197.765, -223.999, 581.0],
[-195.41, -223.613, 580.0],
[-193.062, -223.228, 579.0],
[-190.721, -222.842, 578.0],
[-189.04, -223.228, 579.0],
[-187.998, -224.384, 582.0],
[-185.976, -224.384, 582.0],
[-183.955, -224.384, 582.0],
[-181.621, -223.999, 581.0],
[-179.293, -223.613, 580.0],
[-177.279, -223.613, 580.0],
[-175.264, -223.613, 580.0],
[-173.549, -223.999, 581.0],
[-171.531, -223.999, 581.0],
[-169.513, -223.999, 581.0],
[-167.495, -223.999, 581.0],
[-165.761, -224.384, 582.0],
[-163.74, -224.384, 582.0],
[-161.718, -224.384, 582.0],
[-159.697, -224.384, 582.0],
[-157.946, -224.77, 583.0],
[-155.921, -224.77, 583.0],
[-153.896, -224.77, 583.0],
[-151.871, -224.77, 583.0],
[-149.847, -224.77, 583.0],
[-147.568, -224.384, 582.0]]
谢谢大家,这帮了大忙。如果有人需要,下面是最终代码
#path='Insert Path here'
path='/OBJS2015-12-04-20-26-38-532.txt'
print('hello world')
######################################################################################
#Open the file
try:
f=open(path, 'r')
except:
print ("Path is not Valid")
#Create an array of vertices
vertices = []
#vee = []
t = ()
for line in f:
if line.startswith('v '):
vee = [float(val) for val in line.split()[1:]]
t = tuple(vee)
vertices.append(t)
#Define vertices, faces, edges
verts = vertices
faces = []
#Define mesh and object
mesh = bpy.data.meshes.new("Cube")
object = bpy.data.objects.new("Cube", mesh)
#Set location and scene of object
object.location = bpy.context.scene.cursor_location
bpy.context.scene.objects.link(object)
#Create mesh
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)
所以我想补充一下答案
首先,您应该在Except子句中退出程序,因为它将继续并引发一个值错误,因为不会定义f
except:
print "Invalid Path"
exit() #Or some other way to exit
第二,假设您在读取模式下正确打开了文件,您不应该执行lines.split('\n')来获取每一行吗
lines = lines.split('\n') ##Creates a list of new-lines
再一次,只是补充一下答案。。。希望这有点帮助 对于其他人,遇到此线程。这也是由于使用非ASCII字符来表示“-”。只需使用正则表达式或其他方法修复浮点表示中的非ascii字符,转换就可以了。更详细的信息可以在中找到,首先我没有做n.strip('-'),我试着忽略第一个错误。但我想包括负浮动…破折号是不是除了常规ASCII减号之外的其他字符?