Python 收益率及;正确关闭文件对象
我有以下课程:Python 收益率及;正确关闭文件对象,python,python-2.7,Python,Python 2.7,我有以下课程: class JsonIterator(object): def __init__(self,folder): self.root = os.path.join(os.getcwd(), folder) self.fis = [fi for fi in os.listdir(folder) if "lyrics" in fi] def __iter__(self): i = 0 with open(o
class JsonIterator(object):
def __init__(self,folder):
self.root = os.path.join(os.getcwd(), folder)
self.fis = [fi for fi in os.listdir(folder) if "lyrics" in fi]
def __iter__(self):
i = 0
with open(os.path.join(self.root,self.fis[i])) as f:
yield json.load(f)
i += 1
它没有按我希望的方式工作--它似乎没有超出第一个文件。我试过了
def __iter__(self):
i = 0
f = open(os.path.join(self.root, self.fis[i]))
js = json.load(f)
f.close()
yield js
i += 1
但是无论哪种方式,len(list(jsoniter(“path/to/myfolder”))
都给了我1
,我知道文件夹中有多个文件。当然,另一种选择是
def __iter__(self):
i = 0
yield json.load(open(os.path.join(self.root, self.fis[i])))
i += 1
但是所有那些悬空打开的文件占用了太多内存,我的进程被终止了
那我该怎么办?我想写一些装饰,但我真的不明白它们是如何工作的,甚至不知道它是否能解决我的问题
谢谢 您需要在
self.fis
中循环文件名:
class JsonIterator(object):
def __init__(self,folder):
self.root = os.path.join(os.getcwd(), folder)
self.fis = [fi for fi in os.listdir(folder) if "lyrics" in fi]
def __iter__(self):
for fi in self.fis:
with open(os.path.join(self.root, fi)) as f:
obj = json.load(f)
yield obj
如其他答案中所述,您需要在
\uu iter\uuu()
中的文件列表中进行迭代。下面是使用生成器表达式执行相同操作的等效替代方法:
def __iter__(self):
return (json.load(open(os.path.join(self.root, fi))) for fi in self.fis)
,假设您使用的是CPython。我想我应该将
json.load()
的结果存储在一个变量中,并从上下文管理器外部生成它,以便在函数暂停之前关闭文件;否则,这就是最好的答案。@MacGuy:谢谢你的主意!在我所知道的所有python实现中,当文件被垃圾收集时,它们将自动关闭。只有在使用引用计数的CPython中,才会立即收集数据,而不是在程序退出时,或者在程序稍后经历加载时。