【问题标题】:How can I edit/rename keys during json.load in python?如何在 python 中的 json.load 期间编辑/重命名键?
【发布时间】:2012-06-26 16:22:22
【问题描述】:

我有一个需要加载到 mongodb 的 json 文件 ( ~3Gb )。相当多的 json 键包含一个 . (点),这会导致加载到 mongodb 失败。我想加载 json 文件,并在过程中编辑键名,比如用空格替换点。使用以下python代码

import json

def RemoveDotKey(dataPart):
    for key in dataPart.iterkeys():
        new_key = key.replace(".","")
        if new_key != key:
            newDataPart = deepcopy(dataPart)
            newDataPart[new_key] = newDataPart[key]
            del newDataPart[key]
            return newDataPart
    return dataPart

new_json = json.loads(data, object_hook=RemoveDotKey) 

名为 RemoveDotKey 的 object_hook 应该遍历所有键,它包含一个点,创建一个副本,用空格替换点,然后返回副本。创建了 dataPart 的副本,因为不确定我是否可以迭代 dataPart 的键并同时插入/删除键值对。

这里似乎有一个错误,所有带点的 json 键都没有被编辑。我不太确定 json.load 是如何工作的。也是python新手(使用不到一周)

【问题讨论】:

    标签: python json mongodb


    【解决方案1】:

    你差点就吃完了:

    import json
    
    def remove_dot_key(obj):
        for key in obj.keys():
            new_key = key.replace(".","")
            if new_key != key:
                obj[new_key] = obj[key]
                del obj[key]
        return obj
    
    new_json = json.loads(data, object_hook=remove_dot_key) 
    

    您在循环中返回了一个字典,因此您只需修改一个键。而且您不需要复制这些值,只需重命名键即可。

    【讨论】:

    • 在迭代字典时,该代码不会在更新字典时遇到问题吗?我原以为您需要列出键而不是使用iterkeys()
    • 不创建 obj 的深层副本会显着加快 json 加载过程,将 iterkeys() 替换为 keys() 是关键!谢谢内德,邓肯。
    猜你喜欢
    • 2018-09-21
    • 2021-08-13
    • 2015-02-01
    • 2011-11-30
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多