使用Python通过kwarg“default=”来控制json.dump()格式?

问题描述 投票:0回答:1

在 Python 中,我必须不断将由 JSON 对象组成的用户数据数组转储到存储文件(简单格式:[{}, {}...])。随着程序捕获并记录用户数据,数组 [] 可能会增加到数千个对象。每个对象 {} 最多由大约五十个键值对组成。 我如何使用本机“default =” kwarg 为 json.dump() 编写一个自定义函数,该函数将在新行上启动每个对象,并在之间添加额外的行空间?使用“indent=” kwarg 来漂亮地打印数组会导致文件垂直太长,如果没有这个 kwarg,我会得到一大堆难以读取的对象。

为了说明这个问题,采用一个更短的数组。

example = [{"a":1, "b":2, "c":3,}, {"d":1, "e":2, "f":3,}, {"g":1, "h":2, "i":3}, {"j":6, "k":7, "l":8}]
如果不使用缩进,我的 .json 文件的输出就太紧凑了。

[{"a": 1, "b": 2, "c": 3}, {"d": 1, "e": 2, "f": 3}, {"g": 1, "h": 2, "i": 3}, {"j": 6, "k": 7, "l": 8}]

如果我使用缩进,我会得到一个狭窄的垂直列。

[
  {
    "a": 1,
    "b": 2,
    "c": 3
  },
  {
    "d": 1,
    "e": 2,
    "f": 3
  },
  {
    "g": 1,
    "h": 2,
    "i": 3
  },
  {
    "j": 6,
    "k": 7,
    "l": 8
  }
]

为了在保持可读性的同时最大限度地减少空白,我希望以这种格式输出(此处手动排列)。

[
    {"a": 1, "b": 2, "c": 3},

    {"d": 1, "e": 2, "f": 3},

    {"g": 1, "h": 2, "i": 3}, 

    {"j": 6, "k": 7, "l": 8}
]

当每个对象最多容纳五十个键:值对时,这种格式即使进行包装,也将达到目的。我很惊讶该方法没有提供这样的选项。 但我的经验太少,无法在现有的 json.dump() 方法中强加换行符和额外的行空间。有什么帮助吗?

python json default dump
1个回答
0
投票

您可以将

json
模块与
dumps()
一起使用:

import json


def _dump(example, p):
    with open(p, 'w') as f:
        f.write('[\n')
        for i, e in enumerate(example):
            s = json.dumps(e)
            f.write(f'\t{s}')
            if i < len(example) - 1:
                f.write(',\n\n')
            else:
                f.write('\n')
        f.write(']\n')


example = [
    {"a": 1, "b": 2, "c": 3},
    {"d": 1, "e": 2, "f": 3},
    {"g": 1, "h": 2, "i": 3},
    {"j": 6, "k": 7, "l": 8}
]

_dump(example, 'file.json')


您也可以只

write()
一次:

import json


def custom_dump(example, p):
    res = '[\n'
    for i, e in enumerate(example):
        s = json.dumps(e)
        res += f'\t{s}'
        if i < len(example) - 1:
            res += ',\n\n'
        else:
            res += '\n'
    res += ']\n'

    with open(p, 'w') as f:
        f.write(res)


example = [
    {"a": 1, "b": 2, "c": 3},
    {"d": 1, "e": 2, "f": 3},
    {"g": 1, "h": 2, "i": 3},
    {"j": 6, "k": 7, "l": 8}
]

custom_dump(example, 'file.json')

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.