首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将JSON附加到文件

将JSON附加到文件
EN

Stack Overflow用户
提问于 2016-01-25 21:36:32
回答 2查看 1.1K关注 0票数 0

我正在尝试将值附加到一个json文件中。如何追加数据?我已经尝试了这么多方法,但都不起作用?

代码:

代码语言:javascript
代码运行次数:0
运行
复制
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文件?

EN

回答 2

Stack Overflow用户

发布于 2016-01-25 22:45:03

我怀疑您遗漏了在尝试写入文件的块中获取TypeError。这是你想要写的地方:

代码语言:javascript
代码运行次数:0
运行
复制
with open('offline_post.json','a') as f:
    new = json.loads(f)
    new.update(a_dict)
    json.dump(new,f)

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

其次,在append模式下打开文件,将指针放在文件的末尾。当您运行json.load时,您不会得到任何东西,因为它是在文件末尾读取的。在loading之前,您需要将seek设置为0(编辑:这无论如何都会失败,因为追加模式不可读)。

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

您可能希望使用r+模式,在读取和写入之间返回到文件的开头,并在结束时使用truncate,以防数据结构的大小缩小。

代码语言:javascript
代码运行次数:0
运行
复制
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()

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

代码语言:javascript
代码运行次数:0
运行
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2016-03-04 10:19:28

这是一种不同的方法,我只是想在不重新加载所有数据的情况下进行追加。在覆盆子pi上运行,所以我想关注内存。测试代码-

代码语言:javascript
代码运行次数: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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34993995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档