一連のファイル (それぞれ約 80 ~ 800 MB) にアクセスできます。残念ながら、各ファイルには 1 行しかありません。この行には、JSON オブジェクト (リストのリスト) が 1 つだけ含まれています。それを読み込んで小さな JSON オブジェクトに解析する最良の方法は何ですか?
3 に答える
すでに同様の投稿がここにあります。彼らが提案した解決策は次のとおりです。
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)
リスト全体をメモリにロードすることを避けたい場合は、最初にファイルをテキストとして処理できます。
スタックを使用して、括弧/引用符の開始と終了を追跡します。オープナーのいずれか、または現在のクローザーの文字列をスキャンします。テキストをスキャンするときは、テキストだけを近くで探します。オープナーを読んだら押して、クローザーを見つけたら外します。
JSON の完全なセットは[
-> ]
、{
-> }
、および"
->"
です。ただし、除外する必要\"
があります。仕様はhttp://www.json.org/で確認できます。
次に、 a]
が検出され、一致する をポップした後、スタックに 1 つの項目 (最上位の '[') しかない場合はいつでも[
、新しい行を開始する時期であることがわかります。
最後に、最初[
と最後]
が出力に表示されないようにする必要があります。
これにより、リストの項目ごとに個別の JSON オブジェクトが、ファイルの個別の行にそれぞれ提供されます。
Python JSON ライブラリを掘り下げると、JSON を解析する関数もいくつかあるはずです。それらはパブリック インターフェイスの一部ではありませんが、それらを活用できます。
もちろん、JSON ライブラリを使用して文字列をロードし、他の回答に従って項目ごと (または複数の項目) にダンプすることで、同じことを実現できます。