2012-06-25 31 views
9

Tengo un archivo json (~ 3Gb) que necesito cargar en mongodb. Algunas de las teclas json contienen a. (punto), que hace que la carga en mongodb falle. Quiero cargar el archivo json y editar los nombres de las teclas en el proceso, por ejemplo, reemplazar el punto con un espacio vacío. Usando el siguiente código Python¿Cómo puedo editar/cambiar el nombre de las claves durante json.load en 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) 

El object_hook llama RemoveDotKey debe iterar sobre todas las llaves, una llave que contiene un punto, crear una copia, sustituir el punto por un espacio, y devolver la copia. Creé una copia de dataPart, ya que no estoy seguro si puedo iterar sobre las claves de dataPart e insertar/eliminar pares de valores clave al mismo tiempo.

Parece que hay un error aquí, todas las teclas json con un punto en ellas no se están editando. No estoy muy seguro de cómo funciona json.load. También soy nuevo en Python (estado usando durante menos de una semana)

Respuesta

16

Casi lo tenía:

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) 

Se volvían un diccionario dentro de su bucle, por lo que tan solo te modificar una clave. Y no necesita hacer una copia de los valores, simplemente cambie el nombre de las claves.

+2

¿No es ese el código que va a tener problemas para actualizar el diccionario mientras lo itera? Hubiera pensado que necesitabas hacer una lista de teclas en lugar de usar 'iterkeys()' – Duncan

+1

Hmm, tienes razón, he actualizado el código. –

+2

No crear copias profundas de obj acelera significativamente el proceso de carga json, y reemplazar las iterkeys() con las teclas() es la clave. Gracias Ned, Duncan. – okaytee

Cuestiones relacionadas