Tengo un problema con mi código de Python. He fusionado con éxito múltiples archivos json con python. El código json de cada archivo está en un dict python. Cuando quiero usar esos datos, solo me muestra el nombre del objeto, no el valor.

Este es el código que agrega el código de todos los archivos json dentro de un dict python:

result = []
for f in glob.glob("jsons/*.json"):
    with open(f, "rb") as infile:
        result.append(json.load(infile))

Después de eso, me gustaría mostrar todas las ID de todos los informes de todos los archivos json:

for files in result:
        for reports in files["reports"]:
                print reports["id"]

Pero recibo el mensaje de error:

Traceback (most recent call last):
  File "app.py", line 71, in <module>
    print reports["id"]
TypeError: string indices must be integers

Cuando elimino ["id"], me muestra una lista de todos los nombres de informe (1,2,3, ...) pero no el informe completo con objetos y valores. Solo los nombres de los informes.

Aquí está el código json:

{
    "reports": {
        "1": {
            "id": "123"
        },
        "2": {
            "id": "122"
        },
        "3": {
            "id": "121"
        }
    }
},
{
    "reports": {
        "4": {
            "id": "120"
        },
        "5": {
            "id": "119"
        },
        "6": {
            "id": "118"
        }
    }
},
...
-1
user-2147482138 9 may. 2019 a las 15:54

3 respuestas

La mejor respuesta
for reports in files["reports"]:

files["reports"] es un diccionario, y iterar sobre un diccionario solo vinculará las claves de ese diccionario, y no sus valores. Entonces reports será "1" y luego "2" etc.

Si desea que reports esté vinculado al valor del diccionario {"id": "123"} en lugar de la clave de cadena, especifique esto con el método values:

for reports in files["reports"].values():
1
Kevin 9 may. 2019 a las 13:00

Esos son lists, no matrices.

De todos modos, tenemos un list de dicts anidado, y queremos obtener todos los valores correspondientes a las teclas id en el dicts más interno.

Puede hacerlo con una comprensión list, de la siguiente manera:

[v['id'] for file in files for v in file['reports'].values()]
1
gmds 9 may. 2019 a las 13:00

En correlación con las respuestas anteriores, su json se convirtió en un diccionario, al igual que otros formatos de json hacen lo siguiente. Agregar el método de "valores" o cambiar la iteración a (python3)

for files in result:
  for k,v in results.items():
   print(k, v) 


JSON ----- PYTHON

Objeto ----- dict
Matriz ----- lista
cadena ----- unicode
número (int) ----- int, largo

0
Marshall Fungai 9 may. 2019 a las 14:23