在json行中编辑一行/ nd json

时间:2019-04-01 16:45:52

标签: python json

我正在使用Jsonlinesndjson,并且想使用python在一行中编辑单个键/值并更新文件中的行。

当前,Python库jsonlinesjson-lines似乎仅允许您读取现有条目或编写新条目,而不能编辑现有条目。

例如,在jsonlines library中,您可以打开文件并将对象包装在读取器或写入器中:

import jsonlines
with jsonlines.open('input.jsonl') as reader:
    for obj in reader:
        ...

with jsonlines.open('output.jsonl', mode='w') as writer:
    writer.write(...)

假设您有以下jsonlines文件:

{"name":"Alice","age":24}
{"name":"Bob","age":22}

在python中更新字典非常容易。在这种情况下,它将类似于:

entry = {"name":"Alice","age":24}
entry.update({"age":25})

该库似乎将这些行作为字典打开。您可以从jsonlines库中调用update方法:

import jsonlines
with open('names.jsonl', 'rb') as f:
    for item in json_lines.reader(f):
        item.update({'age':25})
        print(item['age'])

这有两个问题:

  • 它实际上不会更新文件,只是暂时更新字典
    • 文件names.jsonl保持不变
  • 它将为所有条目而不只是特定的条目/行执行此操作
    • 这当然是因为在循环中打开了
    • 您可以根据this solution通过行号转到特定行
    • 但假定您知道特定的行号
    • 真正的时候您只是想按名称查找爱丽丝,并在该条目中更新她的年龄

1 个答案:

答案 0 :(得分:1)

尝试以下代码:

import jsonlines


with jsonlines.open('input.jsonl') as reader, jsonlines.open('output.jsonl', mode='w') as writer:
    for obj in reader:
        if obj['name'] == 'Alice':
            obj['age'] = 25
        writer.write(obj)

input.jsonl字段为output.jsonl时,它将把age的所有行复制到25并将name字段更改为Alice < / p>