我正在尝试将值附加到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文件?
答案 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