#python #class
#python #класс
Вопрос:
Я хочу прочитать данные из 'path_to_csv_file'
и распечатать. Часть кода, которая работает, — это:
import csv
class MyClass:
def f1(self):
with open('path_to_csv_file', "r") as f:
reader = csv.reader(f)
for row in reader:
print(row)
Теперь я хотел бы определить reader из моей функции печати. Для этого я пытаюсь:
import csv
class MyClass:
def __init__(self):
with open('path_to_csv_file', "r") as f:
self.reader = csv.reader(f)
def f2(self):
for row in self.reader:
print(row)
Но выполнение f2
:
MyClass().f2()
выдает следующую ошибку:
for row in self.reader:
ValueError: I/O operation on closed file.
Как я могу определить reader из моей функции и при этом использовать его внутри? (Причина, по которой я заинтересован в этом, заключается в том, что я буду использовать reader во многих функциях внутри MyClass
, и я думаю, что чище определять его только один раз.)
Комментарии:
1. Почему вы думаете, что чище определять его только один раз? Программа чтения будет исчерпана по мере чтения из нее, вам придется
seek
каждый раз начинать. Я бы сказал, что определять его как локальную переменную внутри функции, где она вам нужна, проще, чем управлять еюreader
через целую кучу функций.2. Достаточно справедливо! Вы бы предпочли использовать
with
илиopen
close
внутри f1?3.
with
это рекомендуемый способ pythonic, поэтому я бы использовал это.
Ответ №1:
В тот момент, когда выполнение завершится with
, оно закроет файл. если вам нужно, чтобы файл был открыт, вы должны открыть его с open()
помощью и присвоить ему переменную для закрытия после завершения. См. Ниже.
import csv
class MyClass:
def __init__(self):
self.file=open('csv_file', "r")
self.reader = csv.reader(self.file)
def f2(self):
for row in self.reader:
print(row)
self.file.close()
MyClass().f2()
Как отметил Pranav в комментариях, если вам нужно, чтобы файл был открыт для других функций или для нескольких вызовов f1()
, keep self.file.close()
out of f2()
может быть в его собственной функции.
Комментарии:
1. Обратите внимание, что это означает, что вы можете вызвать только
f2()
один раз, потому что он закрывает файл, когда это сделано. Если вы хотите вызватьf2()
несколько раз, не закрывайте файл. Или откройте файл и создайте reader внутриf2()
. Если reader не используется где-либо еще, на самом деле нет причин делать его переменной экземпляра вместо локальной переменной вf2