首页 > 解决方案 > Python:从调用它的函数中定义 csv.reader

问题描述

我想从中读取数据'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)

现在,我想从我的打印功能中定义阅读器。为此,我尝试:

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我认为只定义一次更简洁。)

标签: pythonclass

解决方案


执行结束的那一刻,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(),可能在其自己的功能中。


推荐阅读