如何在json文件中查找和替换值的一部分

时间:2018-10-31 06:28:03

标签: python json python-3.x

我有一个json文件,正在用作python中的Dictionary。 json文件真的很长,有10k +条记录。我需要用“ id”的值替换“ iscategorical”中的$ home部分。进行更改后,我想保存此文件,以便可以再次将其用作字典。感谢您的帮助。这是一个示例:

{
"maps": [
    {
        "id": "xyzp",
        "iscategorical": "/u/$home/app/home"
    },
    {
        "id": "trtn",
        "iscategorical": "/u/app/$home/user"
    }
]}

4 个答案:

答案 0 :(得分:2)

我了解您能够成功加载文件,而您要做的就是替换字符串并将结构再次保存到文件中。

为此,我们可以遍历数据中的词典列表,并通过将item['iscategorical']替换为$home的值来修改item['id']的值。

然后我们可以将修改后的结构转储回(新的)json文件中。

import json
with open('data.json') as f:
    data = json.load(f)

for item in data['maps']:
    item['iscategorical'] = item['iscategorical'].replace('$home', item['id'])

with open('new_data.json', 'w') as f:
    json.dump(data, f)

答案 1 :(得分:2)

您的问题似乎与-Parsing values from a JSON file?相似。 但是,对于您的情况,以下代码段应该可以工作。

import json

with open('idata.json') as infile:
  data = json.load(infile)

for elem in data["maps"]:
  elem['iscategorical']=elem['iscategorical'].replace('$home',elem['id'])

with open('odata.json', 'w') as outfile:
    json.dump(data, outfile)

答案 2 :(得分:1)

如果是文件,您可以做的一件事是将文件加载到其中并逐行读取。

对于每行,您可以使用正则表达式查找和替换。然后,您可以覆盖文件或写入新文件。

例如,

line.replace('$home', 'id')

或者,您可以加载json python并将其转换为字符串。然后使用正则表达式替换文本。最后,使用json.load()转换回Python字典。 但是10k行太长。我认为逐行读取文件是更好的解决方案。

编辑: 这是代码示例。

from tempfile import mkstemp
from shutil import move
from os import fdopen, remove

def replace(file_path, pattern, subst):
    #Create temp file
    fh, abs_path = mkstemp()
    with fdopen(fh,'w') as new_file:
        with open(file_path) as old_file:
            for line in old_file:
                new_file.write(line.replace(pattern, subst))
    #Remove original file
    remove(file_path)
    #Move new file
    move(abs_path, file_path)

replace('./text.txt', '$home', 'id')

答案 3 :(得分:0)

“该json文件真的很长,具有10k +条记录”-尝试这种方式对大型文件应该有帮助。

  • input.json

{“ maps”:[{“ id”:“ xyzp”,“ iscategorical”:“ / u / $ home / app / home”},{“ id”:“ trtn”,“ iscategorical”:“ / u / app / $ home / user“}]}

import json
with open('input.json') as f:
    data = json.load(f)
my_list = []

def get_some_data():
    for item in data['maps']:
        yield(item['id'], item['iscategorical'])

for id, iscat in get_some_data():
    temp_dict = {}
    temp_dict['id'] = id
    temp_dict['iscategorical'] = iscat.replace('$home', id)
    my_list.append(temp_dict)

maps_dict = {}
maps_dict['maps'] = my_list
with open('output.json', 'w') as f:
    json.dump(maps_dict, f)
  • output.json:

{“地图”:[{“ id”:“ xyzp”,“ iscategorical”:“ / u / xyzp / app / home”},{“ id”:“ trtn”, “ iscategorical”:“ / u / app / trtn /用户”}]}