Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 收益率及;正确关闭文件对象_Python_Python 2.7 - Fatal编程技术网

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中,才会立即收集数据,而不是在程序退出时,或者在程序稍后经历加载时。