2015-12-06 2 views
0

Это очень простая проблема, но я делаю это бесполезно сложным и продолжаю ударять по дорожным блокам.Python, отрицательные числа string to float

Я пытаюсь разобрать простой текстовый файл, содержащий информацию облака точек, 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 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 

Право в порядке. Не так плохо.

Следующая Я использую питона в блендере, чтобы преобразовать эти точки в вершинах:

Это выглядит следующим образом: `

#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,[email protected], 
      #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'] 
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... 

Одна вещь, как же поплавок ('- 531') не будут обрабатываться как отрицательное число. Как бы то ни было, он попадает в «-» sting и считает его нечисловым, поэтому он не может его преобразовать. Но его отрицательный, так как я могу указать, что ???

Спасибо.

+0

Чтобы быть ясным, сначала я не выполнял n.strip ('-'), я попытался пропустить первую ошибку. Но я хотел бы включить отрицательные поплавки ... – umbrellaSriracha

+0

Является ли черта некоторым другим персонажем, чем обычный ASCII минус? – tripleee

ответ

1

Марка ваше чтение немного короче:

verts = [] 
for line in f: 
    if line.startswith('v '): 
     verts.append([float(val) for val in line.split()[1:]]) 

Это должно заменить полный цикл for line in f:. Убедитесь, что в вашем файле нет другой строки, начиная с v. Возможно, после значений есть пустая строка, поэтому вы можете прекратить чтение там.

Теперь verts выглядит следующим образом:

[[-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]] 
0

Там нет никаких проблем преобразования плавать строку из отрицательного числа

>>> 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 
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) 
0

Так просто добавить к ответам ...

Во-первых, вы должны выйти из программы в исключением пункта причиной он будет продолжать и поднимать причину ошибки значение е обыкновение быть определена.

except: 
    print "Invalid Path" 
    exit() #Or some other way to exit 

и второй, если вы правильно открыли файл в режиме чтения, если не вы lines.split («\ п»), чтобы получить каждую другую линию?

lines = lines.split('\n') ##Creates a list of new-lines 

Опять же, просто добавив ответы ... Надеюсь, это помогло немного!