1

リストの大きなリストをjsonファイルに保存しようとしています。リストは長時間実行されるプロセスから生成されるため、新しく生成された情報が利用可能になったら、json ファイルに追加したいと思います。

現在、データ構造を拡張するために、json を Python リストとしてメモリに読み込み、新しいデータをそのリストに追加してから、json ファイル内の古いデータを新しく作成したリストで上書きしています。

def update_json_file(new_data):
    with open('mycoolfile.json', 'rb') as f: 
        jsondata = json.load(f)

    jsondata.append(new_data)
    with open('mycoolfile.json', 'wb') as f: 
        json.dump(jsondata, f)

すべてをメモリに読み込むよりも良い方法はありますか? 確かに、ファイル サイズが大きくなると、これは実行可能な戦略ではなくなります。json ファイル内の構造を拡張する簡単な方法はありますか?

4

1 に答える 1

1

はい、zaquestが言ったように、ファイルのほぼ最後までシークして、外側のリストの最後の「]」を上書きすることができます。これがどのように行われるかを示すものは次のとおりです。

import json
import os

def append_list(json_filename, new_data):
    with open(json_filename, 'r+b') as f:
        f.seek(-1, os.SEEK_END)
        new_json = json.dumps(new_data)
        f.write(', ' + new_json + ']')

# create a test file
lists = [
    'This is the first list'.split(),
    "and here's another.".split(),
    [10, 2, 4],
]

with open('mycoolfile.json', 'wb') as f:
    json.dump(lists, f)

append_list('mycoolfile.json', 'New data.'.split())

with open('mycoolfile.json', 'rb') as f:
    jsondata = json.load(f)
    print json.dumps(jsondata, indent=4)

出力:

[
    [
        "This",
        "is",
        "the",
        "first",
        "list"
    ],
    [
        "and",
        "here's",
        "another."
    ],
    [
        10,
        2,
        4
    ],
    [
        "New",
        "data."
    ]
]
于 2013-10-05T03:03:01.627 に答える