【问题标题】:Python json.dumps() outputs all my data into one line but I want to have a new line for each entryPython json.dumps() 将我的所有数据输出到一行,但我希望每个条目都有一个新行
【发布时间】:2021-02-24 05:12:06
【问题描述】:

我正在使用 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. 

控制台输出:

{"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"}

我缺少什么代码来为每个字典值换行以使我的输出文件看起来与我的控制台相同?

【问题讨论】:

  • 请注意,如果您一次转储并写入一个值,您将不会生成有效的 json 文件,而是ndjson 文件。即您的文件将不是有效的 json,但每一行本身都是有效的 json。这真的是你想要的吗?
  • print 添加换行符。 file.write 没有。
  • 你可以做print(json.dumps(value, sort_keys=True), file=f)

标签: python json loops dictionary


【解决方案1】:

您可以在每个f.write(json.dumps(value, sort_keys=True, indent=0 之后换行 像这样 - f.write('\n')

【讨论】:

  • 谢谢。我的输出文件看起来正是我想要的样子! :)
【解决方案2】:

您只需在每次迭代后添加一个换行符。

f.write("\n")

另外请不要与writelines method 混淆。它也不附加换行符,所以你必须自己处理它。

【讨论】:

    【解决方案3】:

    如果您想生成有效的 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 package(需要通过 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

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 2021-04-19
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多