如何将新字典写入 json 文件

时间:2021-07-05 23:25:14

标签: python json dictionary

我有这个函数可以将字典制作成 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输出文件的代码正确?

1 个答案:

答案 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 这样的包,但这更复杂。)