He mirado a través de la información que el Python docs dar, pero todavía estoy un poco confundido. Podría alguien de correos código de ejemplo que iba a escribir un nuevo archivo, a continuación, utilizar la salmuera para el volcado de un diccionario en ella?

  • Leer a través de este: doughellmann.com/PyMOTW/pickle y volver cuando usted necesita una pregunta específica
  • -1 Ver comentarios anteriores. Intente. Entonces, si no trabajan (no siempre), una dirigida la pregunta puede ser formulada (junto con una hipótesis o dos que pueden ser probados, y «consultó», posiblemente antes de hacer la pregunta a otras personas). E. g hubo un error de sintaxis? Una excepción? Hizo los valores de volver ilegible?
  • He estado tratando de usar esto para guardar la información de pygame. He utilizado la información de arriba y mi código es este:
  • nombre = raw_input(‘nombre del archivo de entrada:’) tf = open(nombre+’.pkl’,’wb’) pickle.dump(total,tf) tf.close()
  • El problema es que me sale un error diciendo que no puede pickle de la superficie de los objetos. Hay una forma de evitar esto? Tengo varios rect objetos guardados en el total.
  • Usted debe hacer una nueva pregunta acerca de cómo pickle de la superficie de los objetos
  • Marque aquí primero, aunque stackoverflow.com/questions/5145664/…
  • Ahora, la primera respuesta es este uno – que en cierto modo hace que tu comentario inútil, y esta pregunta importante.
  • Creo que no he publicado nada en esta página.
  • Eh, que yo recuerde la publicación que ahora, hace mucho tiempo. Definitivamente no eliminar en los últimos 2 días, aunque. Tal vez alguien más se eliminan mi comentario en respuesta a tu comentario?
  • Ah, esa es probablemente la razón – mis disculpas por ser rudo.

InformationsquelleAutor Chachmu | 2012-06-27

9 Comentarios

  1. 569

    Intente esto:

    import pickle
    
    a = {'hello': 'world'}
    
    with open('filename.pickle', 'wb') as handle:
        pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL)
    
    with open('filename.pickle', 'rb') as handle:
        b = pickle.load(handle)
    
    print a == b
    • ¿Por qué eliminar pickle.HIGHEST_PROTOCOL?
    • irrelevante e innecesariamente complicado para este nivel de pregunta — el usuario medio va a estar muy bien con los valores predeterminados.
    • Verdadero para Python 3 usuarios, pero en Python 2, utilizando el protocolo predeterminado (0) no sólo es increíblemente ineficiente en tiempo y espacio, pero que en realidad no puede manejar muchas cosas que el protocolo 2+ asas de bien (por ejemplo, el nuevo estilo de clases que utilizan __slots__). No estoy diciendo que usted debe utilizar siempre HIGHEST_PROTOCOL, pero asegurándonos de que no utilice el protocolo de 0 o 1 en realidad es bastante importante.
    • ¿Qué pickle.HIGHEST_PROTOCOL realmente?
    • Recoge la mayor versión de protocolo de la versión de Python soporta: docs.python.org/3/library/pickle.html#data-stream-format
    • En Python, open() devuelve un objeto de archivo. No opaco puntero de ARCHIVO, no un archivo de unix descriptor ni un archivo de windows manejar. Se trata de un archivo y debería ser llamado como tal.

  2. 69
    import pickle
    
    your_data = {'foo': 'bar'}
    
    # Store data (serialize)
    with open('filename.pickle', 'wb') as handle:
        pickle.dump(your_data, handle, protocol=pickle.HIGHEST_PROTOCOL)
    
    # Load data (deserialize)
    with open('filename.pickle', 'rb') as handle:
        unserialized_data = pickle.load(handle)
    
    print(your_data == unserialized_data)

    La ventaja de HIGHEST_PROTOCOL es que los archivos más pequeños. Esto hace que unpickling a veces mucho más rápido.

    Aviso importante: El tamaño máximo de archivo de la salmuera es de alrededor de 2 GB.

    Forma alternativa de

    import mpu
    your_data = {'foo': 'bar'}
    mpu.io.write('filename.pickle', data)
    unserialized_data = mpu.io.read('filename.pickle')

    Formatos Alternativos

    Para su aplicación, el siguiente podría ser importante:

    • Apoyo de otros lenguajes de programación
    • De lectura /escritura rendimiento
    • Compacto (tamaño de archivo)

    Ver también: Comparación de formatos de serialización de datos

    En caso de que usted es más bien buscando una manera de hacer que los archivos de configuración, es posible que desee leer mi breve artículo Los archivos de configuración en Python

  3. 23
    # Save a dictionary into a pickle file.
    import pickle
    
    favorite_color = {"lion": "yellow", "kitty": "red"}  # create a dictionary
    pickle.dump(favorite_color, open("save.p", "wb"))  # save it into a file named save.p
    
    # -------------------------------------------------------------
    # Load the dictionary back from the pickle file.
    import pickle
    
    favorite_color = pickle.load(open("save.p", "rb"))
    # favorite_color is now {"lion": "yellow", "kitty": "red"}
    • es necesario el uso de un close() después de que el open()?
    • Sí, en general. Sin embargo, en CPython(El valor por defecto de python que usted probablemente tiene), el archivo se cierra automáticamente cuando el archivo objeto caduca (cuando nada se refiere). En este caso, puesto que nada se refiere al objeto de archivo después de ser devuelto por open(), será cerrado tan pronto como la carga devuelve. Esto no es considerado una buena práctica y puede causar problemas en otros sistemas
  4. 10

    En general, decapado un dict fallará a menos que usted tiene sólo objetos simples, como las cadenas y enteros.

    Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
    [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from numpy import *
    >>> type(globals())     
    <type 'dict'>
    >>> import pickle
    >>> pik = pickle.dumps(globals())
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
        Pickler(file, protocol).dump(obj)
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
        self.save(obj)
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
        self._batch_setitems(obj.iteritems())
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
        save(v)
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 306, in save
        rv = reduce(self.proto)
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
        raise TypeError, "can't pickle %s objects" % base.__name__
    TypeError: can't pickle module objects
    >>> 

    Incluso un realmente simple dict a menudo fracasan. Sólo depende de los contenidos.

    >>> d = {'x': lambda x:x}
    >>> pik = pickle.dumps(d)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
        Pickler(file, protocol).dump(obj)
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
        self.save(obj)
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
        self._batch_setitems(obj.iteritems())
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
        save(v)
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
        f(self, obj) # Call unbound method with explicit self
      File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global
        (obj, module, name))
    pickle.PicklingError: Can't pickle <function <lambda> at 0x102178668>: it's not found as __main__.<lambda>

    Sin embargo, si un mejor uso de la serializador como dill o cloudpickle, a continuación, la mayoría de los diccionarios pueden ser en escabeche:

    >>> import dill
    >>> pik = dill.dumps(d)

    O si usted desea guardar su dict a un archivo…

    >>> with open('save.pik', 'w') as f:
    ...   dill.dump(globals(), f)
    ... 

    El último ejemplo es idéntica a cualquiera de las otras buenas respuestas publicado aquí (aparte de dejar a un lado la picklability de los contenidos de la dict son buenos).

  5. 8
    >>> import pickle
    >>> with open("/tmp/picklefile", "wb") as f:
    ...     pickle.dump({}, f)
    ... 

    normalmente es preferible utilizar el cPickle aplicación

    >>> import cPickle as pickle
    >>> help(pickle.dump)
    Help on built-in function dump in module cPickle:
    
    dump(...)
        dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.
    
        See the Pickler docstring for the meaning of optional argument proto.
  6. 5

    Manera Simple volcado de datos de Python (por ejemplo, el diccionario) a un archivo pickle.

    import pickle
    
    your_dictionary = {}
    
    pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
  7. 4

    Si usted sólo desea almacenar el diccionario en un solo archivo, utilice pickle como que

    import pickle
    
    a = {'hello': 'world'}
    
    with open('filename.pickle', 'wb') as handle:
        pickle.dump(a, handle)
    
    with open('filename.pickle', 'rb') as handle:
        b = pickle.load(handle)

    Si quieres guardar y restaurar varios diccionarios en varios archivos para
    el almacenamiento en caché y el almacén de datos más complejos,
    uso anycache.
    No todas las otras cosas que usted necesita alrededor de pickle

    from anycache import anycache
    
    @anycache(cachedir='path/to/files')
    def myfunc(hello):
        return {'hello', hello}

    Anycache las tiendas de los diferentes myfunc resultados en función de los argumentos a
    archivos diferentes en cachedir y recargas de ellos.

    Ver el documentación para más detalles.

  8. 2
    import pickle
    
    dictobj = {'Jack' : 123, 'John' : 456}
    
    filename = "/foldername/filestore"
    
    fileobj = open(filename, 'wb')
    
    pickle.dump(dictobj, fileobj)
    
    fileobj.close()
  9. -6

    He encontrado decapado confuso (posiblemente porque soy de espesor). He encontrado que esto funciona, a pesar de que:

    myDictionaryString=str(myDictionary)

    Que luego se puede escribir en un archivo de texto. Dejé de tratar de utilizar la salmuera como me estaba poniendo de los errores que me dice que escribir números enteros a una .archivo dat. Me disculpo por no usar vinagre.

    • -1: Debe guardarlo como es (que yo.e, un objeto de python) para que podamos leerla más tarde sin horas de espera para que se ejecute de nuevo. Pickle nos permite almacenar un objeto de python para leer más tarde.

Dejar respuesta

Please enter your comment!
Please enter your name here