如何将新字典写入 json 文件

AMM*_*AMM 0 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)

Run Code Online (Sandbox Code Playgroud)

文件中的第一个写入元素不会出现任何问题,但是在将第二个 json 对象添加到文件中后,我得到: SyntaxError: JSON.parse: 在我制作的 json 文件的JSON 数据之后出现意外的非空白字符:

{
    "a": 1,
    "b":2,
    "c": 3
}
{
    "a1": 1,
    "b1":2,
    "c1": 3
}
Run Code Online (Sandbox Code Playgroud)

如何修改 json 输出文件的代码使其正确?

Nic*_*ell 6

这里有几个问题:

file = open('somefile.json', 'a',encoding="utf-8")
Run Code Online (Sandbox Code Playgroud)

您隐含地假设该文件将在此处关闭。在 CPython 上确实如此,但在所有 Python 实现上并非如此。更好的方法是:

with open('somefile.json', 'a',encoding="utf-8") as file:
    file.write(json_obj)
Run Code Online (Sandbox Code Playgroud)

因为它使用上下文管理器来显式关闭文件。

其次,您可以通过直接写入文件来避免创建额外的字符串:

with open('somefile.json', 'a',encoding="utf-8") as file:
    json.dump(someDict, file)
Run Code Online (Sandbox Code Playgroud)

第三,一个文件中包含多个 JSON 对象不是有效的 JSON。您可以在这里采取几种方法。一种是将 JSON 对象包装在列表中:

[
{
    "a": 1,
    "b":2,
    "c": 3
},
{
    "a1": 1,
    "b1":2,
    "c1": 3
}
]
Run Code Online (Sandbox Code Playgroud)

因此,以左括号开始文件,并在每个 JSON 对象(最后一个除外)后面写入一个逗号,然后以右括号结束文件。

第二种方法是用换行符分隔 JSON 对象,如下所示:

{"a": 1,"b":2,"c": 3}
{"a1": 1, "b1":2,"c1": 3}
Run Code Online (Sandbox Code Playgroud)

每一行都是一个 JSON 对象。你会这样读:

with open("filename", "rt") as file:
    for line in file:
        obj = json.loads(line)
        # do something with obj
        # ...
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是您现在可以将每个单独的 JSON 对象加载到内存中,而不必立即加载整个文件。缺点是您不再编写有效的 JSON,因此您无法jq在输出上使用类似的工具。(如果你想要两全其美,你可以使用像 ijson 这样的包,但这更复杂。)