Serialización Python (Python IO)

Serialización Python (Python IO)

En la sección anterior, aprendimos a leer y escribir archivos. Guardar una cadena (u objeto byte) en el disco es una tarea fácil. Pero en la programación real, a menudo necesitamos guardar datos estructurados, como diccionarios complejos, listas anidadas, etc. En este momento, primero tenemos que encontrar formas de convertir estos datos estructurados en una cadena. Este proceso de conversión se llama "Serialización", lo contrario de este proceso es la "deserialización".

Serialización JSON

La operación de serialización de datos se encuentra en varios lenguajes de programación, por supuesto, también hay formatos estandarizados, como: JSON (Notación de Objetos de JavaScript). El formato JSON a menudo es utilizado por las aplicaciones modernas para el intercambio de datos, especialmente en la Web, y es la elección de muchos programadores. El módulo que Python admite para JSON se llama json .
El formato de datos de JSON es muy similar al diccionario y la lista en Python. Se puede decir que es una combinación de un diccionario y una lista. Los tipos de datos básicos de estos diccionarios y listas solo pueden ser: cadena, entero, punto flotante, booleano. Tipo, Ninguno, no puede ser un objeto complejo como una clase personalizada.
Un objeto x se puede convertir a su cadena JSON correspondiente con una simple línea de código:
In [124]: import json

In [125]: json.dumps({'Tom': 23, 'Jim': 25, 'William': 21})
Out[125]: '{"Tom": 23, "Jim": 25, "William": 21}'
Solo hay una línea de código que deserializa una cadena JSON en un objeto Python:
In [126]: json.loads('{"Tom": 23, "Jim": 25, "William": 21}')
Out[126]: {'Tom': 23, 'Jim': 25, 'William': 21}
dumps() método dumps() tiene una variante llamada dump() que serializa los objetos en archivos. Si f es un objeto de archivo, podemos hacer esto:
json.dump(x, f)
De forma correspondiente, la operación de deserialización del objeto de archivo f es:
x = json.load(f)
dumps() tiene una serie de parámetros opcionales que nos permiten generar cadenas JSON en diferentes formatos, que se pueden ver en IPython a través de json.dumps?Podemos descubrirlo a través de los siguientes ejemplos:
(1) La codificación compacta se logra mediante el parámetro separators :
In [130]: json.dumps({"Tom": 23, "Jim": 25, "William": 21}, separators=(',', ':'))
Out[130]: '{"Tom":23,"Jim":25,"William":21}'
(2) La salida de embellecimiento se implementa mediante el parámetro sort_keys, indent:
In [132]: print(json.dumps({"Tom": 23, "Jim": 25, '9':3, '3': 10}, sort_keys=True, indent=4))
{
    "3": 10,
    "9": 3,
    "Jim": 25,
    "Tom": 23
}
(3) El parámetro de codificación chino ensure_ascii predeterminada en Verdadero, que evitará caracteres no-ascii, como el chino:
In [133]: print(json.dumps({"jason": 23, "jack": 25, '9':3, '3': 10}, sort_keys=True, indent=4))
{
    "3": 10,
    "9": 3,
    "\u5c0f\u521a": 23,
    "\u5c0f\u660e": 25
}

In [134]: print(json.dumps({"jason": 23, "jack": 25, '9':3, '3': 10}, sort_keys=True, indent=4, ensure_ascii=False))
{
    "3": 10,
    "9": 3,
    "jason": 23,
    "jack": 25
}

Serialización del módulo pickle

A diferencia del módulo json , pickle puede serializar cualquier objeto Python complejo, que es exclusivo de Python y no puede comunicarse con otros idiomas. Por defecto, también es inseguro. Si los datos están diseñados por un pirata informático, los datos deserializados pueden estar incrustados con código malicioso.
pickle interfaz pickle es la misma que json , la serialización usa dumps(x), dump(x, f) , deserialización usa loads(s), load(f) . Sin embargo, pickle puede serializar objetos complejos arbitrariamente, como clases personalizadas y funciones que pueden ser serializadas con él. Por ejemplo, el siguiente ejemplo es serializar b y deserializar una función:
In [136]: def add(x, y): 
     ...:     print(x+y) 
     ...:

In [137]: import pickle

In [138]: s = pickle.dumps(add)

In [139]: s
Out[139]: b'\x80\x03c__main__\nadd\nq\x00.'

In [140]: f = pickle.loads(s)

In [141]: f
Out[141]: <function __main__.add(x, y)>

In [142]: f(2, 3)
5
A partir de este ejemplo, implementamos la función de serializar y deserializar una función. De esta manera, podemos serializar varias funciones, clases personalizadas, etc., en el archivo y luego enviar el archivo a otros. Otros pueden usar estas clases y funciones personalizadas a través de la deserialización. En este proceso, si alguien interviene en el archivo de serialización, como modificar la implementación de la función add() modificando el archivo, el hacker puede explotarlo para atacarlo. Esta es la razón por la que dijimos que el pickle no es seguro por defecto Entonces, al elegir si usarlo para la serialización, piense primero en ello.

Resumen

Python nos proporciona herramientas para la serialización de datos. Si necesita intercambiar datos con otros programas, json es la mejor opción. Si se usa internamente, el pickle se puede usar como una opción para serializar objetos complejos.

留言