Код в вопросе предполагает, что файл 'screen.txt' выглядит следующим образом:
1,1
2,1
2,2
1,2
Затем вы создаете переменную coords
, которая представляет собой _csv.reader object
, а последующий код ведет себя какесли бы coords
был простым списком. Объект чтения - это специальный объект, который читает файл и разрешает конструкции как for row in coords
. Но он читает только части файла, когда это необходимо (для предотвращения таких случаев, как чтение миллионов строк, когда вам нужно только несколько). После закрытия файла (т. Е. После with open(...
) объект чтения становится непригодным для использования.
В качестве простого обходного пути, и в случае, если файл не очень длинный, вы можете преобразовать координаты в список: coords = list(coords)
. И с тех пор его можно использовать как обычный список.
Кстати, если файл подобен описанному выше, для строки coord.append(coord[0])
.
будет выдана ошибка
list index out of range
.
Другой возможной причиной может быть то, что ваш входной файл содержит пустые строки в конце. Тогда вы получите первую ошибку в x.append(str(row[0]))
или y.append(str(row[1]))
, если в последней строке будет только несколько пробелов. Но после удаления пустых строк вы все равно получите сообщение об ошибке coord.append(coord[0])
Адаптированный код (исключая списки x и y, так как они не используются в этой версии):
import csv
from matplotlib import pyplot as plt
# coord = [[1,1], [2,1], [2,2], [1,2],]
with open('screen.txt', 'r') as csvfile:
coord = csv.reader(csvfile, delimiter=',')
coord = list(coord) # we can step out of the 'with', because the file isn't needed
# anymore once we have the real list
coord.append(coord[0]) # repeat the first point to create a 'closed loop'
xs, ys = zip(*coord) # create lists of x and y values
plt.figure()
plt.plot(xs, ys)
plt.fill(xs, ys, color="r")
plt.gca().set_aspect('equal') # needed so squares look square, x and y axis get the same pixels per unit
plt.show()
Который отображает красивый квадрат:
PS: В приведенной выше версии координаты хранятся в виде строк, хотя может быть более эффективно работать непосредственно с числами.
Лучшеи более читаемая версия (предложенная @ImportanceOfBeingErnest):
import csv
from matplotlib import pyplot as plt
x = []
y = []
# coord = [[1,1], [2,1], [2,2], [1,2],]
with open('screen.txt', 'r') as csvfile:
coord = csv.reader(csvfile, delimiter=',')
for row in coord:
x.append(float(row[0]))
y.append(float(row[1]))
x.append(x[0])
y.append(y[0])
plt.figure()
plt.plot(x, y)
plt.fill(x, y, color="orchid")
plt.show()