我有这个函数可以将字典制作成 json 对象并将它们写入一个 json 文件:
def somethin(a1,a2,a3):
someDict = {"a": a1,
"b": a2,
"c": a3
}
json_obj = json.dumps(someDict)
file = open('somefile.json', 'a',encoding="utf-8")
file.write(json_obj)
第一个写入文件的元素没有出现任何问题,但是在将第二个 json 对象添加到文件后我得到:语法错误:JSON.parse:JSON 数据后出现意外的非空白字符 使用我制作的 json 文件:
{
"a": 1,
"b":2,
"c": 3
}
{
"a1": 1,
"b1":2,
"c1": 3
}
如何修改json输出文件的代码正确?
答案 0 :(得分:2)
这里有几个问题:
file = open('somefile.json', 'a',encoding="utf-8")
您隐含地假设文件将在此处关闭。这在 CPython 上是正确的,但并非在所有 Python 实现上都是如此。更好的方法是:
with open('somefile.json', 'a',encoding="utf-8") as file:
file.write(json_obj)
因为使用 context manager 显式关闭文件。
其次,您可以通过直接写入文件来避免创建额外的字符串:
with open('somefile.json', 'a',encoding="utf-8") as file:
json.dump(someDict, file)
第三,在一个文件中有多个 JSON 对象不是有效的 JSON。您可以在此处采用几种方法。一种是将 JSON 对象包装在一个列表中:
[
{
"a": 1,
"b":2,
"c": 3
},
{
"a1": 1,
"b1":2,
"c1": 3
}
]
因此,文件以左方括号开始,并在每个 JSON 对象(最后一个除外)之后写一个逗号,然后以右方括号结束文件。
第二种方法是换行分隔您的 JSON 对象,如下所示:
{"a": 1,"b":2,"c": 3}
{"a1": 1, "b1":2,"c1": 3}
每一行都是一个 JSON 对象。你会这样读:
with open("filename", "rt") as file:
for line in file:
obj = json.loads(line)
# do something with obj
# ...
这种方法的优点是您现在可以在内存中加载每个单独的 JSON 对象,而不必一次加载整个文件。缺点是您不再编写有效的 JSON,因此您无法在输出上使用 jq
之类的工具。 (如果你想要两全其美,你可以使用像 ijson 这样的包,但这更复杂。)