Introducci贸n
Contenido
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 dict
s, 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.load
y 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!