将JSON附加到文件

时间:2016-01-25 13:36:32

标签: python json

我正在尝试将值附加到json文件。我如何追加数据?我一直在尝试这么多方法,但都没有工作?

代码:

def all(title,author,body,type):

    title = "hello"
    author = "njas"
    body = "vgbhn"
    data = {
            "id" : id,
            "author": author,
            "body" : body,
            "title" : title,
            "type" : type
           }

    data_json = json.dumps(data)
    #data = ast.literal_eval(data)
    #print data_json
    if(os.path.isfile("offline_post.json")):
        with open('offline_post.json','a') as f:
            new = json.loads(f)
            new.update(a_dict)
            json.dump(new,f)
    else:
        open('offline_post.json', 'a')
        with open('offline_post.json','a') as f:
            new = json.loads(f)
            new.update(a_dict)
            json.dump(new,f)

如果调用此函数,如何将数据附加到json文件?

2 个答案:

答案 0 :(得分:3)

我怀疑你遗漏了你在尝试编写文件的区块中获得了TypeError。在这里你要写的地方:

with open('offline_post.json','a') as f:
    new = json.loads(f)
    new.update(a_dict)
    json.dump(new,f)

这里有几个问题。首先,您将文件对象传递给json.loads命令,该命令需要一个字符串。您可能打算使用json.load

其次,您以附加模式打开文件,将指针放在文件的末尾。当您运行json.load时,您将无法获得任何内容,因为它会在文件末尾读取内容。在load 之前你需要seek到0(编辑:无论如何都会失败,因为附加模式不可读)

第三,当您json.dump新数据到文件时,除了旧数据之外,它还会将其附加到文件中。从结构中,您似乎想要替换文件的内容(因为新数据已包含旧数据)。

您可能希望使用r+模式,seek返回读写之间的文件开头,并在结尾处truncate以防万一数据结构不断缩小。

with open('offline_post.json', 'r+') as f:
    new = json.load(f)
    new.update(a_dict)
    f.seek(0)
    json.dump(new, f)
    f.truncate()

或者,您可以打开文件两次:

with open('offline_post.json', 'r') as f:
    new = json.load(f)
new.update(a_dict)
with open('offline_post.json', 'w') as f:
    json.dump(new, f)

答案 1 :(得分:0)

这是一种不同的方法,我只是想在不重新加载所有数据的情况下追加。在树莓派上运行所以想要照顾记忆。测试代码 -

import os

json_file_exists = 0
filename = "/home/pi/scratch_pad/test.json"

# remove the last run json data
try:
    os.remove(filename)
except OSError:
    pass

count = 0
boiler = 90
tower = 78

while count<10:
    if json_file_exists==0:
        # create the json file
        with open(filename, mode = 'w') as fw:  
            json_string = "[\n\t{'boiler':"+str(boiler)+",'tower':"+str(tower)+"}\n]"
            fw.write(json_string)   
            json_file_exists=1
    else:
        # append to the json file
        char = ""
        boiler = boiler + .01
        tower = tower + .02
        while(char<>"}"):
            with open(filename, mode = 'rb+') as f: 
                f.seek(-1,2)
                size=f.tell()
                char = f.read()
                if char == "}":
                    break
                f.truncate(size-1)

        with open(filename, mode = 'a') as fw:  
            json_string = "\n\t,{'boiler':"+str(boiler)+",'tower':"+str(tower)+"}\n]"
            fw.seek(-1, os.SEEK_END)
            fw.write(json_string)

    count = count + 1