2013-10-05 42 views
1

我試圖在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文件內部的結構?

+0

你不能將數據插入文件的中間,期。如果你想有效地做到這一點,請使用某種數據庫。 – millimoose

+0

我同意上面的數據庫評論。 sqlite非常易於使用python。當需要json文件時,可以根據需要構建它。 –

+0

@JoshSmeaton好吧。謝謝你的提示。看來我該終於學習數據庫的工作方式了!我會檢查出sqlite –

回答

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." 
    ] 
] 
相關問題