В Python у меня есть ошибка значения в моей строке с .split (), возвращает 1 ожидаемый 2. Добавление пробела не помогает. Проблема с data.txt? - PullRequest
0 голосов
/ 06 сентября 2018

Извинения, если это название было расплывчатым.Во-первых, я хотел бы сказать, что я прочитал все форумы, которые я могу найти в сообщении об ошибке значения в python, я их реализовал, но моя программа все еще не может пройти дальше строки 22. Внизу есть больше объяснений, но сначала яЯ дам тебе "DL", ха-ха.

Я пишу программу, которая читает файл data.txt и отображает вывод.Вот цель проекта

Ваш вывод должен выглядеть следующим образом: Чтение вершин для многоугольника с 5 вершинами ... Вершина 1 имеет координаты в (1.70, 4.90) Вершина 2 имеет координаты в (6.10, 6.20) Вершина 5 имеет координаты в (1.50, 1.40)


Чтение вершин для прямоугольника, имеющего (конечно) 4 вершины ... Вершина 1 имеет координаты в (7.00, 5.00)... Ваша программа должна только повторить проверку данных;во время этой лабораторной работы не требуется создавать объекты многоугольника, объекты прямоугольника, выполнять преобразования, отменять преобразования или находить и печатать периметр.

Ошибка в моей командной строке:

Reading vertices for polygon with 5 vertices...
Vertex 1 has coordinates at (1.7, 4)
Vertex 2 has coordinates at (.9, 6.1)
Vertex 3 has coordinates at (6.2, 7.0)
Vertex 4 has coordinates at (2.8, 4.8)
Vertex 5 has coordinates at (0.1, 1.)
Reading vertices for polygon with 1 vertices...
Traceback (most recent call last):
File "Read.py", line 22, in <module>
  x, y = file.read(8).split( )
  ValueError: too many values to unpack (expected 2)

Код, который я написал:

file = open("data.txt")

line = file.read(1).strip()

while line != 'Q':

    numVertices = file.read(3).strip()
    numVertices = int(numVertices)

if numVertices != 4:
    print("Reading vertices for polygon with " + 
str(numVertices) + " vertices...") 

else:
    print("Reading vertices for rectangle having " + 
str(numVertices) + " vertices...")

for i in range(int(numVertices)):

    x, y = file.read(8).split( )
    print("Vertex " + str(i + 1) + " has coordinates at (" + x + ", " + y + ")")

line = file.read(1).strip()

file.close()

И файл data.txt содержит:

P  5
1.7   4.9
6.1  6.2
7.0  2.8
4.8  0.1
1.5  1.4
R  4
7.0  5.0
1.0  5.0
1.0  3.0
7.0  3.0
P  4
4.1  5.4
6.9  2.5
2.9  0.8
0.9   2.5
P  3
1.2  4.7
6.5  4.2
4.0  1.7
Q

В строке 22 я попытался добавить в.split (), я добавил (""), (",") ни один из которых не удалось.Я пытался изменить переменные с int на float, но потом я не могу объединить строку.Так что я в растерянности, кто-то может помочь мне выяснить, в чем здесь проблема?Большое вам спасибо!

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Проблема с вашим кодом: очень указанный формат. Наблюдайте за тем, что вы делаете:

read(1)

Это читает ровно один байт. Предположительно ожидается тип полигона / выход. Тогда:

read(3).strip()

Почему 3 байта? Что ж, вы, вероятно, ожидаете пробел после буквы, затем число, указывающее количество вершин, которое должно быть 1 цифрой, и, наконец, - символ новой строки. Всего 3 байта. наконец, для каждой вершины вы

read(8)

8 байтов - 3 для каждой координаты (цифры, десятичной точки, цифры), пробела между ними и, наконец, новой строки.

Если какой-либо символ окажется неуместным, он нарушит ваш код. Вы ожидаете точного форматирования. Если вам не нужно использовать read, не используйте - есть более простые способы, особенно чтение построчно. Если вы должны использовать чтение, убедитесь, что форматирование файла правильное. У вас есть по крайней мере 2 пробела и иногда 3 пробела в предоставленном вами примере - это нарушит ваш код. Наконец, всегда пытайтесь отлаживать небольшие программы с печатью - включив цикл for:

for i in range(int(numVertices)):
    res = file.read(8).split()
    print(res)
    x,y = res

напечатал бы именно то, что вы взламывали, и дал бы подсказку о том, как действовать.

0 голосов
/ 06 сентября 2018

Welp кажется, что проблема решена.

Я работал над этим и придумал альтернативное решение.

Если вам это нравится, прокомментируйте, я сломаю свой метод.

file = open("data.txt")

line = file.readlines()
for i in range(len(line)):
    if 'P' in line[i] or 'R' in line[i]:
        x = line[i].split()
        n_verts = x[1]
        n_verts = int(n_verts)
        print("-"*47)
        print(f"Reading vertices for polygon with {n_verts} vertices...\n")
        for a in range(1, n_verts + 1): 
            verts = line[i+a].split()
            verts = ', '.join(verts)
            print(f"Vertex {a} has coordinates ({verts})")
-----------------------------------------------
Reading vertices for polygon with 5 vertices...

Vertex 1 has coordinates (1.7, 4.9)
Vertex 2 has coordinates (6.1, 6.2)
Vertex 3 has coordinates (7.0, 2.8)
Vertex 4 has coordinates (4.8, 0.1)
Vertex 5 has coordinates (1.5, 1.4)
-----------------------------------------------
Reading vertices for polygon with 4 vertices...

Vertex 1 has coordinates (7.0, 5.0)
Vertex 2 has coordinates (1.0, 5.0)
Vertex 3 has coordinates (1.0, 3.0)
Vertex 4 has coordinates (7.0, 3.0)
-----------------------------------------------
Reading vertices for polygon with 4 vertices...

Vertex 1 has coordinates (4.1, 5.4)
Vertex 2 has coordinates (6.9, 2.5)
Vertex 3 has coordinates (2.9, 0.8)
Vertex 4 has coordinates (0.9, 2.5)
-----------------------------------------------
Reading vertices for polygon with 3 vertices...

Vertex 1 has coordinates (1.2, 4.7)
Vertex 2 has coordinates (6.5, 4.2)
Vertex 3 has coordinates (4.0, 1.7)
0 голосов
/ 06 сентября 2018

Я исправил отступ в вашем коде, интуитивно понимая, где цикл while заканчивается обработкой файла. Я также изменил имя переменной file, так как file - это предопределенный тип, который вы не действительно хотите переопределить.

Программа работает.

in_file = open("data.txt")

line = in_file.read(1).strip()

while line != 'Q':

    numVertices = in_file.read(3).strip()
    numVertices = int(numVertices)

    if numVertices != 4:
        print("Reading vertices for polygon with " +
    str(numVertices) + " vertices...")

    else:
        print("Reading vertices for rectangle having " +
    str(numVertices) + " vertices...")

    for i in range(int(numVertices)):

        x, y = in_file.read(8).split( )
        print("Vertex " + str(i + 1) + " has coordinates at (" + x + ", " + y + ")")

    line = in_file.read(1).strip()

in_file.close()

Выход:

Reading vertices for polygon with 5 vertices...
Vertex 1 has coordinates at (1.7, 4.9)
Vertex 2 has coordinates at (6.1, 6.2)
Vertex 3 has coordinates at (7.0, 2.8)
Vertex 4 has coordinates at (4.8, 0.1)
Vertex 5 has coordinates at (1.5, 1.4)
Reading vertices for rectangle having 4 vertices...
Vertex 1 has coordinates at (7.0, 5.0)
Vertex 2 has coordinates at (1.0, 5.0)
Vertex 3 has coordinates at (1.0, 3.0)
Vertex 4 has coordinates at (7.0, 3.0)
Reading vertices for rectangle having 4 vertices...
Vertex 1 has coordinates at (4.1, 5.4)
Vertex 2 has coordinates at (6.9, 2.5)
Vertex 3 has coordinates at (2.9, 0.8)
Vertex 4 has coordinates at (0.9, 2.5)
Reading vertices for polygon with 3 vertices...
Vertex 1 has coordinates at (1.2, 4.7)
Vertex 2 has coordinates at (6.5, 4.2)
Vertex 3 has coordinates at (4.0, 1.7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...