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 *