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)
我缺少哪些代码来为每个字典值获取一个新行,以便我的输出文件看起来与控制台相同?
如果要生成有效的 JSON 文件,则需要一次写入所有值,而不是一次写入一个值(这将生成ndjson或JSON 行)
所以,对于一个有效的 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 包(需要通过pip
PyPi 安装)。
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)
包的替代方案ndjson
是jsonlines包
小智 7
您可以在每个之后换行
f.write(json.dumps(value, sort_keys=True, indent=0))
Run Code Online (Sandbox Code Playgroud)
像这样 -f.write('\n')