Leer y escribir JSON en un archivo en Python

    Introducción

    En este artículo, analizaremos, leeremos y escribiremos datos JSON en un archivo en Python.

    Durante los últimos 5-10 años, la JSON El formato ha sido una de las formas más populares, si no la más, de serializar datos. Especialmente en el mundo del desarrollo web, es probable que encuentre JSON a través de uno de los muchos API REST, configuración de aplicaciones o incluso un simple almacenamiento de datos.

    Dada su prevalencia e impacto en la programación, en algún momento de su desarrollo probablemente querrá aprender a leer JSON desde un archivo o escribir JSON en un archivo. Ambas tareas son bastante fáciles de realizar con Python, como verá en las siguientes secciones.

    Escribir JSON en un archivo

    La forma más fácil de escribir sus datos en formato JSON en un archivo usando Python es almacenar sus datos en un dict objeto, que puede contener otros anidados dicts, matrices, booleanos u otros tipos primitivos como enteros y cadenas. Puede encontrar una lista más detallada de los tipos de datos admitidos aquí.

    El incorporado json el paquete tiene el código mágico que transforma tu Python dict objeto en la cadena JSON serializada.

    import json
    
    data = {}
    data['people'] = []
    data['people'].append({
        'name': 'Scott',
        'website': 'Pharos.sh.com',
        'from': 'Nebraska'
    })
    data['people'].append({
        'name': 'Larry',
        'website': 'google.com',
        'from': 'Michigan'
    })
    data['people'].append({
        'name': 'Tim',
        'website': 'apple.com',
        'from': 'Alabama'
    })
    
    with open('data.txt', 'w') as outfile:
        json.dump(data, outfile)
    

    Después de importar el json biblioteca, construimos algunos datos simples para escribir en nuestro archivo. La parte importante llega al final cuando usamos el with declaración para abrir nuestro archivo de destino, luego use json.dump para escribir el data objetar al outfile archivo.

    Cualquier objeto similar a un archivo se puede pasar al segundo argumento, incluso si no es un archivo real. Un buen ejemplo de esto sería un socket, que se puede abrir, cerrar y escribir como un archivo. Dado que JSON es popular en toda la web, este es otro caso de uso que puede encontrar.

    Una ligera variación en el json.dump El método que vale la pena mencionar es json.dumps, que devuelve la cadena JSON real en lugar de enviarla directamente a un objeto grabable. Esto puede darle más control si necesita hacer algunos cambios en la cadena JSON (como encriptarla, por ejemplo).

    Leer JSON desde un archivo

    Por otro lado, leer datos JSON de un archivo es tan fácil como escribirlos en un archivo. Usando el mismo json paquete de nuevo, podemos extraer y analizar la cadena JSON directamente desde un objeto de archivo. En el siguiente ejemplo, hacemos precisamente eso y luego imprimimos los datos que obtuvimos:

    import json
    
    with open('data.txt') as json_file:
        data = json.load(json_file)
        for p in data['people']:
            print('Name: ' + p['name'])
            print('Website: ' + p['website'])
            print('From: ' + p['from'])
            print('')
    

    json.load es el método importante a tener en cuenta aquí. Lee la cadena del archivo, analiza los datos JSON, completa un Python dict con los datos y se los devuelve.

    Al igual que json.dump, json.load tiene un método alternativo que le permite manejar cadenas directamente ya que muchas veces probablemente no tendrá un objeto similar a un archivo que contenga su JSON. Como probablemente adivinó, este método es json.loads. Considere el caso en el que está llamando a un punto final REST GET que devuelve JSON. Estos datos le llegan como una cadena, que luego puede pasar a json.loads directamente en su lugar.

    Opciones

    Al serializar sus datos a JSON con Python, el resultado estará en el formato estándar y no será muy legible ya que se eliminan los espacios en blanco. Si bien este es el comportamiento ideal para la mayoría de los casos, a veces es posible que deba realizar pequeños cambios, como agregar espacios en blanco para que sea legible por humanos. Ambos json.dump y json.load proporcione bastantes opciones para una mayor flexibilidad, algunas de las cuales se describirán aquí.

    Impresión bonita

    Hacer que JSON sea legible por humanos (también conocido como “impresión bonita”) es tan fácil como pasar un valor entero para el indent parámetro:

    >>> import json
    >>> data = {'people':[{'name': 'Scott', 'website': 'Pharos.sh.com', 'from': 'Nebraska'}]}
    >>> json.dumps(data, indent=4)
    {
        "people": [
            {
                "website": "Pharos.sh.com", 
                "from": "Nebraska", 
                "name": "Scott"
            }
        ]
    }
    

    En realidad, esto es bastante útil, ya que a menudo tendrá que leer datos JSON durante el desarrollo. Otra opción es utilizar la herramienta de línea de comandos, json.tool. Entonces, si solo desea imprimir JSON en la línea de comando, puede hacer algo como esto:

    $ echo '{"people":[{"name":"Scott", "website":"Pharos.sh.com", "from":"Nebraska"}]}' | python -m json.tool
    {
        "people": [
            {
                "name": "Scott",
                "website": "Pharos.sh.com"
                "from": "Nebraska",
            }
        ]
    }
    
    Clasificación

    En JSON, un objeto se define como:

    Un objeto es un conjunto desordenado de pares nombre / valor.

    Entonces, el estándar dice que el orden de las claves no está garantizado, pero es posible que lo necesite para sus propios fines internamente. Para lograr ordenar, puede pasar True al sort_keys opción al usar json.dump o json.dumps.

    >>> import json
    >>> data = {'people':[{'name': 'Scott', 'website': 'Pharos.sh.com', 'from': 'Nebraska'}]}
    >>> json.dumps(data, sort_keys=True, indent=4)
    {
        "people": [
            {
                "from": "Nebraska",
                "name": "Scott",
                "website": "Pharos.sh.com"
            }
        ]
    }
    
    Texto ASCII

    Por defecto, json.dump se asegurará de que todo su texto en el diccionario de Python dado esté codificado en ASCII. Si hay caracteres que no son ASCII, se escapan automáticamente, como se muestra en el siguiente ejemplo:

    >>> import json
    >>> data = {'item': 'Beer', 'cost':'£4.00'}
    >>> jstr = json.dumps(data, indent=4)
    >>> print(jstr)
    {
        "item": "Beer",
        "cost": "u00a34.00"
    }
    

    Esto no siempre es aceptable y, en muchos casos, es posible que desee mantener los caracteres Unicode sin tocar. Para hacer esto, configure el ensure_ascii opción a False.

    >>> jstr = json.dumps(data, ensure_ascii=False, indent=4)
    >>> print(jstr)
    {
        "item": "Beer",
        "cost": "£4.00"
    }
    

    Conclusión

    En este artículo le presentamos el json.dump, json.dumps, json.loady json.loads métodos, que ayudan a serializar y deserializar cadenas JSON.

    Dado que JSON se ha convertido en una de las formas más populares de serializar datos estructurados, es probable que tenga que interactuar con ellos con bastante frecuencia, especialmente cuando trabaje en aplicaciones web. Python json es una excelente manera de comenzar, aunque probablemente encontrará que simplejson es otra gran alternativa que es mucho menos estricta en la sintaxis JSON (que guardaremos para otro artículo).

    ¿Cuáles son algunos de sus casos de uso comunes para almacenar datos JSON? ¿Persistencia de datos, configuración u otra cosa? ¡Háznoslo saber en los comentarios!

     

    Etiquetas:

    Deja una respuesta

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