2

次の構造を持つ 4 GB の JSON ファイルがあります。

{
    rows: [
        { id: 1, names: { first: 'john', last: 'smith' }, dates: ...},
        { id: 2, names: { first: 'tim', middle: ['james', 'andrew'], last: 'wilson' }, dates: ... },
    ]
}

すべての行を反復処理し、行ごとに ID、名前、その他の詳細を抽出して、CSV ファイルに書き込みたいだけです。

標準的な方法でファイルを開こうとすると、ハングします。次のように、IJSONを使用しようとしています。

f = open('./myfile.json')
rows = ijson.items(f, 'rows')
for r in rows:
    print r

これは、ファイルの短い抽出では正常に機能しますが、大きなファイルでは永久にハングします。

この IJSON メソッドも試してみましたが、これは大きな 4GB ファイルで機能するようです。

for prefix, the_type, value in ijson.parse(open(fname)):
    print prefix, value

しかし、これはすべてのリーフノードを順番に出力するように見えます.各トップレベルの行を個別のアイテムとしての概念はありません-これは、任意の数のリーフノードを持つJSONデータの場合、すぐに面倒になります. すべての名前の配列を取得するには、次のようにする必要があります。

names = []
name = {}
for prefix, the_type, value in ijson.parse(open(fname)):
    print prefix, value
    name[prefix] = 'value'
    if 'first' in name and 'last' in name and 'middle' in name:
        # This is the last of the leaf nodes, we can add it to our list...
        # except.... how to deal with the fact that middle may not 
        # always be present?
        names.append(name)
        name = {}

このような大きなファイルで、(各リーフではなく) 各行を順番に繰り返す方法はありますか?

4

0 に答える 0