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

8
我正在使用Python处理一些json数据。我循环遍历我的数据(它们都是字典),当我将循环值打印到控制台时,每行输出一个字典。
但是,当我使用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. 

控制台输出:

{"first_name": "John", "last_name": "Smith", "food": "corn"}
{"first_name": "Jane", "last_name": "Doe", "food": "soup"}

我的输出文件中的输出内容:

{"first_name": "John", "last_name": "Smith", "food": "corn"}{"first_name": "Jane", "last_name": "Doe", "food": "soup"}

我需要添加哪些代码才能使每个字典值都换行,以便输出文件与控制台输出的一样?

2
请注意,如果您每次转储并写入一个值,您将无法生成有效的 JSON 文件,而是 ndjson 文件。也就是说,您的文件将不是有效的 JSON,但是每行本身都是有效的 JSON。这真的是您想要的吗? - buran
1
print 命令会添加一个换行符,而 file.write 命令则不会。 - user2357112
你可以使用print(json.dumps(value, sort_keys=True), file=f)来实现。 - Dennis
3个回答

9
如果您想生成有效的JSON文件,您需要一次性编写所有值,而不是逐个编写值(这将生成ndjsonJSON lines)。
因此,对于一个有效的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)

some_file.json

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

如果您真的需要使用 ndjson,您可以使用 ndjson 包(需要通过 PyPi 的 pip 进行安装)。

import ndjson

with open('some_file2.ndjson', 'w') as f:
    ndjson.dump(values, f)

some_file2.ndjson

{"first_name": "John", "last_name": "Smith", "food": "corn"}
{"first_name": "Jane", "last_name": "Doe", "food": "soup"}

ndjson包的替代方案是jsonlines包。


6

您可以按照以下方式在每个f.write(json.dumps(value, sort_keys=True, indent=0之后换行:

f.write('\n')

1
谢谢。我的输出文件看起来和我想要的完全一样! :) - drome845

3
你只需在每次迭代后添加一个换行符即可。

f.write("\n")

请不要把 writelines 方法 和它混淆。它也不会附加换行符,因此您仍然需要自己处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接