为了账号安全,请及时绑定邮箱和手机立即绑定

python 从json数组中删除多余的键值

python 从json数组中删除多余的键值

芜湖不芜 2023-10-18 21:06:08
我有一个包含对象数组的 json 文件,文件内的数据如下所示:[ {‘name’: ‘A’, ‘address’: ‘some address related to A’, ‘details’: ‘some details related to A’}, {‘name’: ‘B’, ‘address’: ‘some address related to A’, ‘details’: ‘some details related to B’}, {‘name’: ‘C’, ‘address’: ‘some address related to A’, ‘details’: ‘some details related to C’}]我想删除多余的键值,所以输出应该是这样的:  [   {‘name’: ‘A’,   ‘address’: ‘some address related to A’,   ‘details’: ‘some details related to A’},   {‘name’: ‘B’,   ‘details’: ‘some details related to B’},   {‘name’: ‘C’,   ‘details’: ‘some details related to C’}  ]所以,我尝试过这段代码,在此链接中找到了它:import jsonwith open(‘./myfile.json’) as fp:    data= fp.read()  unique = []for n in data:    if all(unique_data["address"] != data for unique_data["address"] in unique):        unique.append(n)#print(unique)   with open(“./cleanedRedundancy.json”, ‘w’) as f:     f.write(unique)但它给了我这个错误:TypeError: string indices must be integers
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

我做了有/没有文件支持的解决方案,默认情况下没有,对于您的情况,支持文件更改use_files = Falseuse_files = True我的脚本内部。

我预计您想要删除具有相同(键,值)对的重复项。

在线尝试一下!

import json


use_files = False

# Only duplicates with next keys will be deleted

only_keys = {'address', 'complex'}


if not use_files:

    fdata = """

    [

     {

       "name": "A",

       "address": "some address related to A",

       "details": "some details related to A"

     },

     {

       "name": "B",

       "address": "some address related to A",

       "details": "some details related to B",

       "complex": ["x", {"y": "z", "p": "q"}],

       "dont_remove": "test"

     },

     {

       "name": "C",

       "address": "some address related to A",

       "details": "some details related to C",

       "complex": ["x", {"p": "q", "y": "z"}],

       "dont_remove": "test"

     }

    ]

    """


if use_files:

    with open("./myfile.json", 'r', encoding = 'utf-8') as fp:

        data = fp.read()

else:

    data = fdata


entries = json.loads(data)


unique = set()

for e in entries:

    for k, v in list(e.items()):

        if k not in only_keys:

            continue

        v = json.dumps(v, sort_keys = True)

        if (k, v) in unique:

            del e[k]

        else:

            unique.add((k, v))


if use_files:

    with open("./cleanedRedundancy.json", "w", encoding = 'utf-8') as f:

        f.write(json.dumps(entries, indent = 4, ensure_ascii = False))

else:

    print(json.dumps(entries, indent = 4, ensure_ascii = False))

输出:


[

    {

        "name": "A",

        "address": "some address related to A",

        "details": "some details related to A"

    },

    {

        "name": "B",

        "details": "some details related to B",

        "complex": [

            "x",

            {

                "y": "z",

                "p": "q"

            }

        ],

        "dont_remove": "test"

    },

    {

        "name": "C",

        "details": "some details related to C",

        "dont_remove": "test"

    }

]


查看完整回答
反对 回复 2023-10-18
  • 1 回答
  • 0 关注
  • 53 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信