如何在python中的json.load期间编辑/重命名键?

oka*_*tee 13 python json mongodb

我有一个json文件(~3Gb),我需要加载到mongodb.相当多的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) 
Run Code Online (Sandbox Code Playgroud)

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

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

Ned*_*der 21

你几乎拥有它:

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) 
Run Code Online (Sandbox Code Playgroud)

你在循环中返回一个字典,所以你只修改一个键.而且您不需要复制值,只需重命名键即可.

  • 在迭代时更新字典的代码是不是会遇到问题?我原以为你需要制作一个键列表而不是使用`iterkeys()` (2认同)
  • 不创建obj的深层副本会显着加快json加载过程,并且用键()替换iterkeys()是关键!谢谢Ned,Duncan. (2认同)