Python:从调用它的函数中定义csv.reader
我想从Python:从调用它的函数中定义csv.reader,python,class,Python,Class,我想从“path\u到\u csv\u文件”读取数据并打印。一段有效的代码是: 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) 现在,我想从我的打印函
“path\u到\u csv\u文件”
读取数据并打印。一段有效的代码是:
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)
现在,我想从我的打印函数中定义阅读器。为此,我尝试:
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.
我如何在函数外定义读取器,但在函数内使用它?(我对此感兴趣的原因是,我将在
MyClass
中的许多函数中使用reader,我认为只定义一次会更简洁。)执行时,它将关闭文件。如果需要打开文件,则必须使用open()
打开文件,并将其分配给一个变量,以便在完成后关闭。请参阅下文
导入csv
类别MyClass:
定义初始化(自):
self.file=open('csv_文件',“r”)
self.reader=csv.reader(self.file)
def f2(自身):
对于self.reader中的行:
打印(行)
self.file.close()文件
MyClass().f2()
正如Pranav在评论中指出的那样,如果您需要打开文件以用于其他函数或多次调用f1()
,请将self.file.close()
保留在f2()
之外,它可能在自己的函数中。一旦执行完成with
,它就会关闭文件。如果需要打开文件,则必须使用open()
打开文件,并将其分配给一个变量,以便在完成后关闭。请参阅下文
导入csv
类别MyClass:
定义初始化(自):
self.file=open('csv_文件',“r”)
self.reader=csv.reader(self.file)
def f2(自身):
对于self.reader中的行:
打印(行)
self.file.close()文件
MyClass().f2()
正如Pranav在注释中所指出的,如果您需要打开文件以用于其他函数或多次调用f1()
,请将self.file.close()
保留在f2()
之外,它可能在自己的函数中。注意,这意味着您只能调用f2()
一次,因为这样做后它会关闭文件。如果要多次调用f2()
,请不要关闭该文件。或者打开文件并在f2()
内创建读卡器。除非读卡器也在其他地方使用,否则实际上没有理由在f2
中将其作为实例变量而不是局部变量。请注意,这意味着您只能调用f2()
一次,因为这样做时它会关闭文件。如果要多次调用f2()
,请不要关闭该文件。或者打开文件并在f2()
内创建读卡器。除非阅读器也在其他地方使用,否则实际上没有理由在f2
中将其作为实例变量而不是局部变量,为什么您认为只定义一次会更简洁?当你阅读时,读者会筋疲力尽,你每次都必须seek
。我认为,在需要它的函数中,将它定义为局部变量比在整个函数组中管理一个读卡器要简单得多。这很公平!您更愿意在f1内部使用with
还是open
+close
?with
是推荐的pythonic方式,所以我会使用它。为什么您认为只定义一次比较干净?当你阅读时,读者会筋疲力尽,你每次都必须seek
。我认为,在需要它的函数中,将它定义为局部变量比在整个函数组中管理一个读卡器要简单得多。这很公平!您更愿意在f1内部使用和还是打开+关闭。