Saltar al contenido

¿Cómo extraer múltiples objetos JSON de un archivo?

Ya no tienes que indagar más por internet porque estás al lugar perfecto, tenemos la solución que necesitas encontrar sin complicarte.

Solución:

Actualización: escribí una solución que no requiere leer todo el archivo de una sola vez. Es demasiado grande para una respuesta de stackoverflow, pero se puede encontrar aquí jsonstream.

Puedes usar json.JSONDecoder.raw_decode para decodificar cadenas arbitrariamente grandes de JSON “apiladas” (siempre que quepan en la memoria). raw_decode se detiene una vez que tiene un objeto válido y devuelve la última posición donde no formaba parte del objeto analizado. No está documentado, pero puede devolver esta posición a raw_decode y comienza a analizar nuevamente desde esa posición. Desafortunadamente, el pitón json El módulo no acepta cadenas que tengan espacios en blanco como prefijo. Así que necesitamos buscar para encontrar la primera parte sin espacios en blanco de su documento.

from json import JSONDecoder, JSONDecodeError
import re

NOT_WHITESPACE = re.compile(r'[^s]')

def decode_stacked(document, pos=0, decoder=JSONDecoder()):
    while True:
        match = NOT_WHITESPACE.search(document, pos)
        if not match:
            return
        pos = match.start()
        
        try:
            obj, pos = decoder.raw_decode(document, pos)
        except JSONDecodeError:
            # do something sensible if there's some error
            raise
        yield obj

s = """

"a": 1  


   [
1
,   
2
]


"""

for obj in decode_stacked(s):
    print(obj)

huellas dactilares:

'a': 1
[1, 2]

usa un json arrayen el formato:

[
"ID":"12345","Timestamp":"20140101", "Usefulness":"Yes",
  "Code":["event1":"A","result":"1",…],
"ID":"1A35B","Timestamp":"20140102", "Usefulness":"No",
  "Code":["event1":"B","result":"1",…],
"ID":"AA356","Timestamp":"20140103", "Usefulness":"No",
  "Code":["event1":"B","result":"0",…],
...
]

Luego impórtelo en su código python

import json

with open('file.json') as json_file:

    data = json.load(json_file)

Ahora el contenido de los datos es un array con diccionarios que representan cada uno de los elementos.

Puede acceder a él fácilmente, es decir:

data[0]["ID"]

Entonces, como se mencionó en un par de comentarios que contenían los datos en un array es más simple, pero la solución no escala bien en términos de eficiencia a medida que aumenta el tamaño del conjunto de datos. Realmente solo deberías usar un iterador cuando quieras acceder a un objeto aleatorio en el array, de lo contrario, los generadores son el camino a seguir. A continuación, he creado un prototipo de una función de lector que lee cada objeto json individualmente y devuelve un generador.

La idea básica es señalar al lector que se divida en el carácter del carro. "n" (o "rn" para ventanas). Python puede hacer esto con el file.readline() función.

import json
def json_reader(filename):
    with open(filename) as f:
        for line in f:
            yield json.loads(line)

Sin embargo, este método solo funciona realmente cuando el archivo está escrito como lo tiene, con cada objeto separado por un carácter de nueva línea. A continuación escribí un ejemplo de un escritor que separa un array de objetos json y guarda cada uno en una nueva línea.

def json_writer(file, json_objects):
    with open(file, "w") as f:
        for jsonobj in json_objects:
            jsonstr = json.dumps(jsonobj)
            f.write(jsonstr + "n")

También puedes hacer la misma operación con file.writelines() y una lista de comprensión:

...
    json_strs = [json.dumps(j) + "n" for j in json_objects]
    f.writelines(json_strs)
...

Y si desea agregar los datos en lugar de escribir un nuevo archivo, simplemente cambie open(file, "w") para open(file, "a").

Al final, encuentro que esto ayuda mucho no solo con la legibilidad cuando trato de abrir archivos json en un editor de texto, sino también en términos de usar la memoria de manera más eficiente.

En ese sentido, si cambia de opinión en algún momento y desea que el lector obtenga una lista, Python le permite colocar una función generadora dentro de una lista y completar la lista automáticamente. En otras palabras, solo escribe

lst = list(json_reader(file))

Recuerda que puedes difundir esta reseña si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *