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 输出文件的代码使其正确?
这里有几个问题:
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 这样的包,但这更复杂。)
| 归档时间: |
|
| 查看次数: |
6021 次 |
| 最近记录: |