在不关闭文件的情况下调用新函数

问题描述 投票:0回答:1

我有一个打开 csv 文件的方法和另一个我想用来处理该文件的方法 - 但我还需要它来处理不同类型的对象,所以我想将其保留为独立的方法。

import csv

class Loader():

    def load_from_csv(self, csv_path: str):

        with open(csv_path, mode='r', encoding='utf-8') as file:
            reader = csv.DictReader(file)
            return self._read_and_yield(reader)
    
    @classmethod
    def _read_and_yield(cls,reader):
        for row in reader:
            yield(row)

loader = Loader()
for row in loader.load_from_csv('sample.csv'):
    print(row)

但是我得到了

ValueError: I/O operation on closed file
,因为当我调用
_read_and_yield
方法时,文件似乎已关闭。这里它只产生行,但想象一下我必须执行更多操作的情况:我应该对每种类型的文件重复此过程(即
read_from_excel
)。

我该如何处理?

python iterator yield
1个回答
0
投票

执行

with
语句时,
return
块会关闭文件句柄,因此
csv.DictReader
迭代器无法再从文件中读取。

您可以让

load_from_csv
在上下文管理器中从
_read_and_yield
生成生成的值,以便文件句柄在调用者迭代时可以保持打开状态:

with open(csv_path, mode='r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    yield from self._read_and_yield(reader)
© www.soinside.com 2019 - 2024. All rights reserved.