Python json.dumps() 将所有数据输出到一行中,但我希望每个条目都有一个新行

dro*_*845 8 python json dictionary loops

我正在使用 Python 和一些 json 数据。我正在循环访问我的数据(都是字典),当我将循环值打印到控制台时,我每行得到 1 个字典。

但是,当我使用 json.dumps() 执行同一行代码将对象转换为能够输出的字符串时,我会在字典中得到多行,而不是在字典外得到新行。

循环时如何在每个字典值后添加新行?

代码示例:

    def test(values, filename):
      with open(filename, 'w') as f:
        for value in values:
            print(json.dumps(value, sort_keys=True)) # gives me each dictionary in a new line
            f.write(json.dumps(value, sort_keys=True, indent=0) #gives me a new line for each key/value pair instead of after each dictionary. 
Run Code Online (Sandbox Code Playgroud)

控制台输出:

{"first_name": "John", "last_name": "Smith", "food": "corn"}
{"first_name": "Jane", "last_name": "Doe", "food": "soup"}
Run Code Online (Sandbox Code Playgroud)

我的输出文件中的输出:

{"first_name": "John", "last_name": "Smith", "food": "corn"}{"first_name": "Jane", "last_name": "Doe", "food": "soup"}
Run Code Online (Sandbox Code Playgroud)

我缺少哪些代码来为每个字典值获取一个新行,以便我的输出文件看起来与控制台相同?

bur*_*ran 9

如果要生成有效的 JSON 文件,则需要一次写入所有值,而不是一次写入一个值(这将生成ndjsonJSON 行

所以,对于一个有效的 JSON

values = [{"first_name": "John", "last_name": "Smith", "food": "corn"},
          {"first_name": "Jane", "last_name": "Doe", "food": "soup"}]

import json
with open('some_file.json', 'w') as f:
    json.dump(values, f, indent=4)
Run Code Online (Sandbox Code Playgroud)

一些_文件.json

[
    {
        "first_name": "John",
        "last_name": "Smith",
        "food": "corn"
    },
    {
        "first_name": "Jane",
        "last_name": "Doe",
        "food": "soup"
    }
]
Run Code Online (Sandbox Code Playgroud)

如果你确实需要ndjson- 你可以使用ndjson 包(需要通过pipPyPi 安装)。

import ndjson

with open('some_file2.ndjson', 'w') as f:
    ndjson.dump(values, f)
Run Code Online (Sandbox Code Playgroud)

some_file2.ndjson

{"first_name": "John", "last_name": "Smith", "food": "corn"}
{"first_name": "Jane", "last_name": "Doe", "food": "soup"}
Run Code Online (Sandbox Code Playgroud)

包的替代方案ndjsonjsonlines


小智 7

您可以在每个之后换行

f.write(json.dumps(value, sort_keys=True, indent=0))
Run Code Online (Sandbox Code Playgroud)

像这样 -f.write('\n')