在 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() 方法中强加换行符和额外的行空间。有什么帮助吗?
您可以将
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')