4

一連のファイル (それぞれ約 80 ~ 800 MB) にアクセスできます。残念ながら、各ファイルには 1 行しかありません。この行には、JSON オブジェクト (リストのリスト) が 1 つだけ含まれています。それを読み込んで小さな JSON オブジェクトに解析する最良の方法は何ですか?

4

3 に答える 3

4

すでに同様の投稿がここにあります。彼らが提案した解決策は次のとおりです。

import json
with open('file.json') as infile:
  o = json.load(infile)
  chunkSize = 1000
  for i in xrange(0, len(o), chunkSize):
    with open('file_' + str(i//chunkSize) + '.json', 'w') as outfile:
      json.dump(o[i:i+chunkSize], outfile)
于 2012-04-19T23:48:07.723 に答える
3

リスト全体をメモリにロードすることを避けたい場合は、最初にファイルをテキストとして処理できます。

スタックを使用して、括弧/引用符の開始と終了を追跡します。オープナーのいずれか、または現在のクローザーの文字列をスキャンします。テキストをスキャンするときは、テキストだけを近くで探します。オープナーを読んだら押して、クローザーを見つけたら外します。

JSON の完全なセットは[-> ]{-> }、および"->"です。ただし、除外する必要\"があります。仕様はhttp://www.json.org/で確認できます。

次に、 a]が検出され、一致する をポップした後、スタックに 1 つの項目 (最上位の '[') しかない場合はいつでも[、新しい行を開始する時期であることがわかります。

最後に、最初[と最後]が出力に表示されないようにする必要があります。

これにより、リストの項目ごとに個別の JSON オブジェクトが、ファイルの個別の行にそれぞれ提供されます。

Python JSON ライブラリを掘り下げると、JSON を解析する関数もいくつかあるはずです。それらはパブリック インターフェイスの一部ではありませんが、それらを活用できます。

もちろん、JSON ライブラリを使用して文字列をロードし、他の回答に従って項目ごと (または複数の項目) にダンプすることで、同じことを実現できます。

于 2012-04-20T00:02:49.060 に答える