почему команда open не позволяет мне открывать и читать файл без использования команды 'with'? - PullRequest
0 голосов
/ 12 сентября 2018

Я новичок в коде Python и прошел несколько связанных вопросов объяснение различий между командами 'with' и 'with open'.

Но из-за недостатка знаний о Python 3 я до сих пор не понимаю разницу между ними и не могу понять, как заставить мой код работать.

В учебном пособии, которое я сейчас изучаю, ответ следующий:

import csv
import matplotlib.pyplot as plt
x=[]
y=[]
with open('example.txt', 'r') as csvfile:
    plot = csv.reader (csvfile, delimiter = ',')
    for row in plots:
        x.append(int(row[0]))
        y.append(int(row[1]))

plt.plot(x,y,label='file')
plt.show()

Я пытался использовать команду open и csv.reader, как показано ниже

import csv
import matplotlib.pyplot as plt
plotdata = open ('testing.csv') 
reader = csv.reader(plotdata, delimiter =',')
hx=[ ]
hy=[ ]
for x in reader:
    hx.append(reader[0])
    hy.append(reader[1])
plt.plot(hx, hy)

Пока работает первый с командой «with», следующий без команды «with» не работает. На всякий случай я добавил команду close() в конце, но продолжаю показывать сообщение об ошибке «Ошибка TypeError: объект _csv.reader недопустим»

Что не так?

Ответы [ 2 ]

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

Я думаю, что проблема в том, что во втором коде вы подписываетесь напрямую reader[0], в противном случае в первом коде вы подписываете его повторное значение (row in plots), преобразованное: int(row[0]).

Это должно работать:

for x in reader:
    hx.append(int(x[0]))
    hy.append(int(x[1]))
plt.plot(hx, hy)
0 голосов
/ 13 сентября 2018

Мои идеи следующие:

a) всегда использовать with в файловых операциях

b) за исключением упражнений, которые разделяют чтение данных и манипулирование данными

c) plot (плохое имя) и reader являются итераторами, в цикле вы используете итератор для получения row или x, которые являются элементами, предоставляемыми итератором.reader сам по себе не может быть адресован [0], вы должны были вместо этого использовать x[0] и x[1].

...