Como la cuestión se explica el problema, he estado tratando de generar anidada objeto JSON. En este caso he for bucles de la obtención de datos de diccionario de dic. A continuación está el código:

f = open("test_json.txt", 'w')
flag = False
temp = ""
start = "{\n\t\"filename\"" + " : \"" +initial_filename+"\",\n\t\"data\"" +" : " +" [\n"
end = "\n\t]" +"\n}"
f.write(start)
for i, (key,value) in enumerate(dic.iteritems()):
    f.write("{\n\t\"keyword\":"+"\""+str(key)+"\""+",\n")
    f.write("\"term_freq\":"+str(len(value))+",\n")
    f.write("\"lists\":[\n\t")
    for item in value:
        f.write("{\n")
        f.write("\t\t\"occurance\" :"+str(item)+"\n")
        #Check last object
        if value.index(item)+1 == len(value):
            f.write("}\n" 
            f.write("]\n")
        else:
            f.write("},") # close occurrence object
    # Check last item in dic
    if i == len(dic)-1:
        flag = True
    if(flag):
        f.write("}")
    else:
        f.write("},") #close lists object
        flag = False 

#check for flag
f.write("]") #close lists array 
f.write("}")

Espera que la salida es:

{
"filename": "abc.pdf",
"data": [{
    "keyword": "irritation",
    "term_freq": 5,
    "lists": [{
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 2
    }]
}, {
    "keyword": "bomber",
    "lists": [{
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 2
    }],
    "term_freq": 5
}]
}

Pero actualmente estoy recibiendo una salida como la siguiente:

{
"filename": "abc.pdf",
"data": [{
    "keyword": "irritation",
    "term_freq": 5,
    "lists": [{
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 2
    },]                // Here lies the problem "," before array(last element)
}, {
    "keyword": "bomber",
    "lists": [{
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 1
    }, {
        "occurance": 2
    },],                  // Here lies the problem "," before array(last element)
    "term_freq": 5
}]
}

Por favor ayuda, he tratado de resolverlo, pero no pudo. Por favor, no se marca duplicar pues ya he comprobado otras respuestas y no ayuda en absoluto.

Edit 1:
La entrada es básicamente tomada de un diccionario dic cuyo tipo de asignación es <String, List>
por ejemplo: «irritación» => [1,3,5,7,8]
cuando la irritación es la clave, y se asigna a una lista de números de página.
Esto es, básicamente, leer en el exterior para bucle donde la clave es la palabra clave y el valor es una lista de las páginas de la aparición de esa palabra clave.

Edit 2:

dic = collections.defaultdict(list) # declaring the variable dictionary
dic[key].append(value) # inserting the values - useless to tell here
for key in dic:
    # Here dic[x] represents list - each value of x
    print key,":",dic[x],"\n" #prints the data in dictionary
  • si es debidamente formados json archivo puede utilizar el json módulo en lugar de importación como de texto. Puede proporcionar cualquier detalle de su archivo de entrada?
  • de entrada es un proceso largo, voy a editar la respuesta con la abstracción de la entrada
  • Por qué no utilizar json.volcado y, a continuación, actualizar el objeto JSON como llegan los datos?
  • El pozo allí es una sencilla librería llamada json (pip instalar no requiere ), el uso de import json; print json.dumps(dic) y frío
  • el uso de la biblioteca, ¿cómo resolver el problema, podrías por favor compartir un fragmento de código? @ZdaR
  • Ya he compartido el código necesario en el comentario de arriba es tan simple como import json print json.dumps(dic)
  • esto es lo que me pasa como a la salida { "over-dries": [4], "Self": [2], "Cooling": [4] } que no es lo que quiero, por favor, comprenda que el problema de la lectura del diccionario y el resultado esperado
  • Por favor ponga su dic var en la pregunta para que podamos reconstruir una respuesta perfecta.
  • Seguro, la edición de la pregunta, aunque la mitad de la respuesta es resuelto, puede editar la primera respuesta, y lo acepto.
  • Thx, puedo añadir una nueva parte para la impresión, dime en los comentarios si era de alguna manera útil o si quieres conocer más.
  • Cualquier tipo de ayuda es respetado @MaxChrétien , Así que, gracias por todas las sugerencias y ayuda.

InformationsquelleAutor Asif Ali | 2017-02-13

2 Comentarios

  1. 7

    Lo @andrea-f se ve bien para mí, aquí otra solución:

    Siéntase libre de elegir a los dos 🙂

    import json
    
    dic = {
            "bomber": [1, 2, 3, 4, 5],
            "irritation": [1, 3, 5, 7, 8]
          }
    
    filename = "abc.pdf"
    
    json_dict = {}
    data = []
    
    for k, v in dic.iteritems():
      tmp_dict = {}
      tmp_dict["keyword"] = k
      tmp_dict["term_freq"] = len(v)
      tmp_dict["lists"] = [{"occurrance": i} for i in v]
      data.append(tmp_dict)
    
    json_dict["filename"] = filename
    json_dict["data"] = data
    
    with open("abc.json", "w") as outfile:
        json.dump(json_dict, outfile, indent=4, sort_keys=True)

    Es la misma idea, voy a crear en primer lugar una gran json_dict para ser guardados directamente en json. Yo uso el con declaración para guardar el json evitar la captura de exception

    También, usted debe echar un vistazo a la doc de json.vertederos() si la necesidad futura de mejorar en su json de salida.

    EDITAR

    Y sólo por diversión, si no te gusta tmp var, usted puede hacer todos los datos for bucle en un one-liner 🙂

    json_dict["data"] = [{"keyword": k, "term_freq": len(v), "lists": [{"occurrance": i} for i in v]} for k, v in dic.iteritems()]

    Podría dio para la solución final, algo que no es totalmente legible como este:

    import json
    
    json_dict = {
                  "filename": "abc.pdf",
                  "data": [{
                            "keyword": k,
                            "term_freq": len(v),
                            "lists": [{"occurrance": i} for i in v]
                           } for k, v in dic.iteritems()]
                }
    
    with open("abc.json", "w") as outfile:
        json.dump(json_dict, outfile, indent=4, sort_keys=True)

    EDITAR 2

    Parece que usted no desea guardar su json como la salida deseada, pero poder para leer ella.

    De hecho, también se puede utilizar json.dumps() para de impresión su json.

    with open('abc.json', 'r') as handle:
        new_json_dict = json.load(handle)
        print json.dumps(json_dict, indent=4, sort_keys=True)

    Todavía hay un problema aquí, sin embargo, "filename": se imprime al final de la lista debido a que el d de data viene antes de la f.

    A la fuerza de la orden, usted tendrá que usar un OrderedDict en la generación de la dict. Tenga cuidado de que la sintaxis es feo (omi) con python 2.X

    Aquí está la nueva solución completa 😉

    import json
    from collections import OrderedDict
    
    dic = {
            'bomber': [1, 2, 3, 4, 5],
            'irritation': [1, 3, 5, 7, 8]
          }
    
    json_dict = OrderedDict([
                  ('filename', 'abc.pdf'),
                  ('data', [ OrderedDict([
                                            ('keyword', k),
                                            ('term_freq', len(v)),
                                            ('lists', [{'occurrance': i} for i in v])
                                         ]) for k, v in dic.iteritems()])
                ])
    
    with open('abc.json', 'w') as outfile:
        json.dump(json_dict, outfile)
    
    
    # Now to read the orderer json file
    
    with open('abc.json', 'r') as handle:
        new_json_dict = json.load(handle, object_pairs_hook=OrderedDict)
        print json.dumps(json_dict, indent=4)

    De salida será:

    {
        "filename": "abc.pdf", 
        "data": [
            {
                "keyword": "bomber", 
                "term_freq": 5, 
                "lists": [
                    {
                        "occurrance": 1
                    }, 
                    {
                        "occurrance": 2
                    }, 
                    {
                        "occurrance": 3
                    }, 
                    {
                        "occurrance": 4
                    }, 
                    {
                        "occurrance": 5
                    }
                ]
            }, 
            {
                "keyword": "irritation", 
                "term_freq": 5, 
                "lists": [
                    {
                        "occurrance": 1
                    }, 
                    {
                        "occurrance": 3
                    }, 
                    {
                        "occurrance": 5
                    }, 
                    {
                        "occurrance": 7
                    }, 
                    {
                        "occurrance": 8
                    }
                ]
            }
        ]
    }

    Pero hay que tener cuidado, la mayoría de las veces, es mejor ahorrar un regular .json archivo con el fin de ser de la cruz idiomas.

    • Lo habéis clavado jefe.
    • Max, lo siento venir tan tarde a esta pregunta, pero ¿puede usted por favor me ayuden con una pregunta que tengo, que se basa en líneas similares,stackoverflow.com/questions/53731125/…
  2. 2

    Su código actual no está funcionando porque el bucle itera a través de la ante-último elemento de la adición de la }, entonces cuando el bucle se ejecuta de nuevo en ella se establece la bandera falsa, pero la última vez que se corrió añadió un , ya que pensaba que no será otro elemento.

    Si este es tu dict: a = {"bomber":[1,2,3,4,5]} entonces usted puede hacer:

    import json
    file_name = "a_file.json"
    file_name_input = "abc.pdf"
    new_output = {}
    new_output["filename"] = file_name_input
    
    new_data = []
    i = 0
    for key, val in a.iteritems():
       new_data.append({"keyword":key, "lists":[], "term_freq":len(val)})
       for p in val:
           new_data[i]["lists"].append({"occurrance":p})
       i += 1
    
    new_output['data'] = new_data

    A continuación, guarde los datos por:

    f = open(file_name, 'w+')
    f.write(json.dumps(new_output, indent=4, sort_keys=True, default=unicode))
    f.close()
    • Lo siento, pero por favor comprendan el problema, yo no soy de leer un archivo JSON de cualquier tipo, tengo que crear un JSON salida de diccionario de Editar > 1 y no sólo de salida directa vez formateado como pronto en el resultado esperado
    • se puede comprobar la actualización de la respuesta?
    • Por favor, puedes volver a darle formato en la manera que se muestra en se espera la salida de. Traté de él, terminó obteniendo varios errores. Va a ser útil y voy a aceptar la respuesta, gracias por los esfuerzos
    • ¿qué pasa ahora?
    • Su código es bueno, pero creo que la idea original de @AsifAli utilizar enumarate en el for bucle en lugar de i = 0; i++ es más python (omi). También, por favor, busque en mi respuesta al caso de uso de la with declaración.

Dejar respuesta

Please enter your comment!
Please enter your name here