是否可以将信息附加到json文件内的结构而无需先将其读入内存?

时间:2013-10-05 01:47:46

标签: python json

我正在尝试在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文件中的结构?

1 个答案:

答案 0 :(得分: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."
    ]
]