3

我有以下课程:

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(JsonIterator("path/to/myfolder")))都给了我1,而且我知道文件夹中有多个文件。当然,另一种选择是

def __iter__(self):
    i = 0
    yield json.load(open(os.path.join(self.root, self.fis[i])))
    i += 1

但是所有那些悬空的打开文件都占用了太多内存,我的进程被杀死了。

所以我该怎么做?我想过写一些装饰器,但我真的不明白它们是如何工作的,或者即使它可以解决我的问题。

谢谢!

4

2 回答 2

3

您需要遍历以下文件名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
于 2013-03-26T19:34:08.107 回答
0

如其他答案中所述,您需要遍历__iter__(). 这是一个等效的替代方案,它使用生成器表达式来做同样的事情:

def __iter__(self):
    return (json.load(open(os.path.join(self.root, fi))) for fi in self.fis)

假设您使用的是 CPython,这些文件将在被垃圾收集时自动关闭。

于 2013-03-26T19:36:52.057 回答