我有一个打开 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
)。
我该如何处理?
执行
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)