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 に答える