Yo estoy luchando para anexar una lista en un escabeche de archivo.
Este es el código:

#saving high scores to a pickled file

import pickle

first_name = input("Please enter your name:")
score = input("Please enter your score:")

scores = []
high_scores = first_name, score
scores.append(high_scores)

file = open("high_scores.dat", "ab")
pickle.dump(scores, file)
file.close()

file = open("high_scores.dat", "rb")
scores = pickle.load(file)
print(scores)
file.close()

La primera vez que ejecute el código, se imprime el nombre y la puntuación.

La segunda vez que se ejecute el código, se imprime el 2 nombres y 2 puntuaciones.

La tercera vez que se ejecute el código, se imprime el nombre y la puntuación, pero sobrescribe el segundo nombre y la puntuación con el nombre de la tercera parte y la puntuación entré. Yo solo quiero que mantenga la adición de los nombres y puntuaciones. No entiendo por qué es guardar el nombre y sobrescribir el segundo.

OriginalEl autor Charlie | 2015-01-21

4 Comentarios

  1. 9

    Usted necesita para tirar de la lista de la base de datos (es decir, su archivo pickle) primero antes de añadir a la misma.

    import pickle
    import os
    
    high_scores_filename = 'high_scores.dat'
    
    scores = []
    
    # first time you run this, "high_scores.dat" won't exist
    #   so we need to check for its existence before we load 
    #   our "database"
    if os.path.exists(high_scores_filename):
        # "with" statements are very handy for opening files. 
        with open(high_scores_filename,'rb') as rfp: 
            scores = pickle.load(rfp)
        # Notice that there's no "rfp.close()"
        #   ... the "with" clause calls close() automatically! 
    
    first_name = input("Please enter your name:")
    score = input("Please enter your score:")
    
    high_scores = first_name, score
    scores.append(high_scores)
    
    # Now we "sync" our database
    with open(high_scores_filename,'wb') as wfp:
        pickle.dump(scores, wfp)
    
    # Re-load our database
    with open(high_scores_filename,'rb') as rfp:
        scores = pickle.load(rfp)
    
    print(scores)
    Muchas gracias dogwynn. Esta solución funciona de maravilla.
    Gracias también por la explicación adicional se ha proporcionado con el código.
    Por qué comprobar si existe el archivo, si usted acaba de cargar a una nueva variable, y evitar el problema real?
    Supongo que no sé cómo llamar a la vinagreta.carga de un archivo que no existe. Sé que usted puede hacer esto con DBv2 API de módulos (por ejemplo, dejar de lado), pero yo no soy consciente de que un archivo objeto (que pepinillos.carga requiere) que puede ser abierto en modo «crear» (sin crear uno). De lo contrario, mi objetivo era tener una secuencia de comandos que se pueden ejecutar varias veces desde la línea de comandos, cada vez añadiendo una nueva (nombre,puntuación) de la tupla.
    modo de ab en lugar de wb va a crear un archivo si no existe uno, y anexar si uno hace. Además, no estoy sugiriendo que usted debe tratar de load de un archivo inexistente, sólo señalar que el OP del problema es más general, uno de deshacer en un objeto que tiene el mismo nombre que el de lista existente-y por lo tanto la destrucción de cualquiera de las ediciones a la lista existente que se hicieron después de la dump.

    OriginalEl autor dogwynn

  2. 11

    Si quieres escribir y leer para el curtido de archivo, usted puede llamar a volcar varias veces para cada entrada en la lista. Cada vez que usted volcado, anexar una puntuación para el curtido de archivo, y cada vez que se cargue de leer la siguiente puntuación.

    >>> import pickle as dill
    >>> 
    >>> scores = [('joe', 1), ('bill', 2), ('betty', 100)]
    >>> nscores = len(scores)
    >>> 
    >>> with open('high.pkl', 'ab') as f:
       _ = [dill.dump(score, f) for score in scores]
    ... 
    >>> 
    >>> with open('high.pkl', 'ab') as f:
    ...   dill.dump(('mary', 1000), f)
    ... 
    >>> # we added a score on the fly, so load nscores+1
    >>> with open('high.pkl', 'rb') as f:
    ...     _scores = [dill.load(f) for i in range(nscores + 1)]
    ... 
    >>> _scores
    [('joe', 1), ('bill', 2), ('betty', 100), ('mary', 1000)]
    >>>

    La razón de que el código estaba fallando más probable es que usted está reemplazando el original scores con el unpickled lista de puntuaciones. Así que si hay alguna nueva puntuaciones añadido, tendría que hacerlos volar lejos en la memoria.

    >>> scores
    [('joe', 1), ('bill', 2), ('betty', 100)]
    >>> f = open('high.pkl', 'wb')
    >>> dill.dump(scores, f)
    >>> f.close()
    >>> 
    >>> scores.append(('mary',1000))
    >>> scores
    [('joe', 1), ('bill', 2), ('betty', 100), ('mary', 1000)]
    >>> 
    >>> f = open('high.pkl', 'rb')
    >>> _scores = dill.load(f)
    >>> f.close()
    >>> _scores
    [('joe', 1), ('bill', 2), ('betty', 100)]
    >>> blow away the old scores list, by pointing to _scores
    >>> scores = _scores
    >>> scores
    [('joe', 1), ('bill', 2), ('betty', 100)]

    Por lo que es más de un python nombre de problema de referencia para scores, que es un pickle problema. Pickle se acaba de crear instancias de una nueva lista y llamando a scores (en su caso) y, a continuación, se recoge la basura cualquier cosa scores se señaló antes.

    >>> scores = 1
    >>> f = open('high.pkl', 'rb')
    >>> scores = dill.load(f)
    >>> f.close()
    >>> scores
    [('joe', 1), ('bill', 2), ('betty', 100)]
    Gracias también por tu aportación. dogwynn la solución funcionó muy bien, pero va a tomar en cuenta lo que usted ha dicho.
    ¿Por qué es pepinillo dill aquí?
    porque yo uso dill en lugar de pickle, así que eso es lo que he usado para mi solución. pickle también funciona, así que en vez de la edición de mi código, acabo de cambiar la importación. Todo picking… dill es simplemente mejor que él.

    OriginalEl autor Mike McKerns

  3. 0

    Doesnt realmente responder a la pregunta, pero si alguien desea agregar un solo elemento a la vez para un apuro, puedes hacerlo…

    import pickle
    import os
    
    high_scores_filename = '/home/ubuntu-dev/Desktop/delete/high_scores.dat'
    
    scores = []
    
    # first time you run this, "high_scores.dat" won't exist
    #   so we need to check for its existence before we load
    #   our "database"
    if os.path.exists(high_scores_filename):
        # "with" statements are very handy for opening files.
        with open(high_scores_filename,'rb') as rfp:
            scores = pickle.load(rfp)
        # Notice that there's no "rfp.close()"
        #   ... the "with" clause calls close() automatically!
    
    names = ["mike", "bob", "joe"]
    
    for name in names:
        high_score = name
        print(name)
        scores.append(high_score)
    
    # Now we "sync" our database
    with open(high_scores_filename,'wb') as wfp:
        pickle.dump(scores, wfp)
    
    # Re-load our database
    with open(high_scores_filename,'rb') as rfp:
        scores = pickle.load(rfp)
    
    print(scores)
    Una mala respuesta. No resuelve la cuestión
    Como se indica mediante las 5 primeras palabras del post.
    Maldita sea, no lo leyeron. Mi mal
    No se preocupe! Estás en lo correcto, todo bien. 🙂

    OriginalEl autor CENTURION

  4. 0

    No uso de la salmuera, pero el uso de h5py que también resuelve el propósito

    with h5py.File('.\PreprocessedData.h5', 'a') as hf:
        hf["X_train"].resize((hf["X_train"].shape[0] + X_train_data.shape[0]), axis = 0)
        hf["X_train"][-X_train_data.shape[0]:] = X_train_data
    
        hf["X_test"].resize((hf["X_test"].shape[0] + X_test_data.shape[0]), axis = 0)
        hf["X_test"][-X_test_data.shape[0]:] = X_test_data
    
    
        hf["Y_train"].resize((hf["Y_train"].shape[0] + Y_train_data.shape[0]), axis = 0)
        hf["Y_train"][-Y_train_data.shape[0]:] = Y_train_data
    
        hf["Y_test"].resize((hf["Y_test"].shape[0] + Y_test_data.shape[0]), axis = 0)
        hf["Y_test"][-Y_test_data.shape[0]:] = Y_test_data

    fuente

    ¿Por qué no utilizar hickle o klepto lugar? Ambos están construidos para dar una simple dump y load pickle-equivalente a la sintaxis para HDF5. Si reemplaza dill en mi respuesta con hickle, creo que debería funcionar, y como almacén de HDF5.
    Sí, funciona. Gracias por la info. Yo no sabía acerca de hickle.

    OriginalEl autor Dheeraj M Pai

Dejar respuesta

Please enter your comment!
Please enter your name here