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内部使用
还是
打开
+
关闭