Ошибка массива Python - PullRequest
0 голосов
/ 24 июля 2011

привет. Я пытаюсь загрузить координаты для черчения из текстового файла, и у меня появляется ошибка, которую я не понимаю. Координаты выглядят так в файле (0.1, 0.0, 0.0), (0.613125, 0.52202, 0.19919) Вот код, который я пытаюсь запустить:

from visual import *

with open ('/Desktop/Coordlist2.txt','r') as open_file:

    rightFace = curve(pos=[(1,-1,-1), (1,-1,1), (1,-1,-1),(1,1,-1),(1,1,-1),(1,1,1),(1,1,1),(1,-1,1)], radius=0.01, color=color.cyan)
    backFace = curve(pos=[(1,-1,-1), (-1,-1,-1), (-1,-1,-1),(-1,1,-1),(-1,1,-1),(1,1,-1)], radius=0.01, color=color.cyan)
    leftFace = curve(pos=[(-1,-1,-1), (-1,-1,1), (-1,-1,1),(-1,1,1),(-1,1,1),(-1,1,-1)], radius=0.01, color=color.cyan)
    frontFace = curve(pos=[(-1,-1,1), (1,-1,1), (1,1,1),(-1,1,1)], radius=0.01, color=color.cyan)

    for line in open_file.readlines():
        coords = line
        points(pos=[coords], size=1, color=color.yellow)

Это сообщение об ошибке, которое я получаю:

Traceback (most recent call last):
  File "/Users/Graphs.py", line 15, in <module>
    points(pos=[coords], size=1, color=color.yellow)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vis/primitives.py", line 84, in __init__
    self.process_init_args_from_keyword_dictionary( keywords )
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vis/primitives.py", line 212, in process_init_args_from_keyword_dictionary
    setattr(self, key, value)
ValueError: Object cannot be converted to array.

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Как они выглядят в файле не имеет значения; они читаются как строки. Вам нужно будет проанализировать строки, прежде чем они могут быть использованы; попробуйте ast.literal_eval().

2 голосов
/ 24 июля 2011

Проблема здесь:

for line in open_file.readlines():
    coords = line

Когда вы читаете строку из файла, вы всегда получаете строку.Затем вам нужно обработать эту строку, чтобы получить любую необходимую вам структуру данных.Так что если у вас есть строка, которая выглядит следующим образом (например)

l = '(5, 6, 7)'

, вам нужно явно разбить ее и создать из нее кортеж:

l_tuple = tuple(int(n) for n in l.strip('()').split(','))

Также как agfнапомнил мне, вы, вероятно, должны просто сделать for line in open_file;open_file.readlines создает копию файла в памяти, в то время как for line in open_file просто перебирает строки по отдельности, не копируя весь файл в память.

Просто чтобы быть как можно более полным, преобразовать строку, которая выглядит следующим образом:

s = '(0.1, 0.0, 0.0), (0.613125, 0.52202, 0.19919)'

Вы можете сделать это:

>>> numbers = tuple(float(n.strip('( )')) for n in s.split(','))
>>> t1, t2 = numbers[:3], numbers[3:]

Это работает так долготак как всегда есть два кортежа по 3 в строке.

решение agf в его комментарии тоже работает, но оно немного более хрупкое, так как кортежи должны быть разделены точно на '), ('.По правде говоря, решение Игнасио действительно лучшее.:)

...