Estoy aprendiendo acerca de la serialización de objetos para la primera vez. Traté de leer y de ‘googlear’ por las diferencias en los módulos de pepinillos y dejar de lado, pero yo no estoy seguro de entenderlo. Cuándo utilizar uno?
La salmuera se puede convertir todos los objetos de python en la secuencia de bytes que se pueden almacenar en un archivo. Entonces, ¿por qué necesitamos el módulo de dejar de lado? No pickle más rápido?

  • Es como en el caso de que la salmuera es como un muy bajo nivel de las cosas y dejar de lado nos proporciona más maneras para almacenar objetos complejos?
  • shelve proporciona un diccionario de estilo de interfaz para el decapado. Una interfaz de diccionario para el decapado es conveniente para la implementación de las cosas como el almacenamiento en caché de resultados (para que no se te ocurra volver a calcular) — las claves que se *args,**kwds y siendo el valor de los resultados calculados.
  • Tenga en cuenta que shelve NO permiten almacenar objetos que pickle no pepinillos. Si usted está buscando una mejor versión de shelve que puede almacenar la mayoría de los objetos de python, así como proporciona una mayor flexibilidad del diccionario interfaz del disco o de la base de datos… entonces es posible que desee buscar en klepto. Ver: stackoverflow.com/a/32586980/2379433
InformationsquelleAutor zubinmehta | 2010-11-05

1 Comentario

  1. 82

    pickle es para serializar un objeto (u objetos), como un único bytestream en un archivo.

    shelve construye en la parte superior de pickle e implementa una serialización diccionario donde los objetos son en escabeche, pero asociado a una clave (cadena), así que usted puede cargar su archivado de archivos de datos y acceder a su escabeche de objetos a través de las teclas. Esto podría ser más conveniente si se serializar muchos objetos.

    Aquí es un ejemplo de uso entre los dos. (debe trabajar en la últimas versiones de Python 2.7 y Python 3.x).

    pickle Ejemplo

    import pickle
    
    integers = [1, 2, 3, 4, 5]
    
    with open('pickle-example.p', 'wb') as pfile:
        pickle.dump(integers, pfile)

    Esto va a volcar el integers lista a un archivo binario llamado pickle-example.p.

    Ahora tratar de leer el escabeche de archivo.

    import pickle
    
    with open('pickle-example.p', 'rb') as pfile:
        integers = pickle.load(pfile)
        print integers

    El de arriba debe de salida [1, 2, 3, 4, 5].

    shelve Ejemplo

    import shelve
    
    integers = [1, 2, 3, 4, 5]
    
    # If you're using Python 2.7, import contextlib and use
    # the line:
    # with contextlib.closing(shelve.open('shelf-example', 'c')) as shelf:
    with shelve.open('shelf-example', 'c') as shelf:
        shelf['ints'] = integers

    Observe cómo agregar objetos a la estantería a través de diccionario de acceso.

    Leer el objeto de nuevo con un código como el siguiente:

    import shelve
    
    # If you're using Python 2.7, import contextlib and use
    # the line:
    # with contextlib.closing(shelve.open('shelf-example', 'r')) as shelf:
    with shelve.open('shelf-example', 'r') as shelf:
        for key in shelf.keys():
            print(repr(key), repr(shelf[key])))

    La salida será 'ints', [1, 2, 3, 4, 5].

    • Puede arrojar alguna luz sobre lo que es la ‘c’ de la bandera es que en la llamada a shelve.open? Busqué en google pero no podía encontrar una respuesta. Gracias de antemano.
    • el 'c' indica shelve para abrir el fichero para lectura y escritura, o para crear el archivo si es necesario. También se describe en shelve.open‘s de la documentación, que comparte la misma banderas como anydbm.open.
    • ¿Qué versión de Python que hace su ejemplo de trabajo con? En 2.7.10, es lo que indica que no hay ningún Contexto Gerente implementado para dejar de lado: ----> 5 with shelve.open('shelf-example-file.txt', 'c') as shelf: 6 for k, v in my_dict: 7 shelf[k] = v AttributeError: DbfilenameShelf instance has no attribute '__exit__'
    • Debo de haber comprobado mi código en 3.x pero no 2.7.x, probablemente suponiendo contexto administrador de uso no ser diferentes entre ellos. He actualizado mis ejemplos a decir que si usted está usando Python 2.7, usted debe import contextlib en el código y, a continuación, ajustar su shelve.open con contextlib.closing().
    • Esta respuesta podría beneficiarse de un párrafo acerca de cuándo prefieres que, y si pepinillos en realidad es significativamente más rápido

Dejar respuesta

Please enter your comment!
Please enter your name here