Cuando yo uso el pepinillo, funciona bien y puedo botar la carga.

El problema es que si cierro el programa y tratar de volcado de nuevo, reemplaza el antiguo archivo de datos con el nuevo dumping. Aquí está mi código:

import pickle
import os
import time


dictionary = dict()


def read():
    with open('test.txt', 'rb') as f:
        a = pickle.load(f)
    print(a)
    time.sleep(2)


def dump():
    chs = raw_input('name and number')
    n = chs.split()
    dictionary[n[0]] = n[1]
    with open('test.txt', 'wb') as f:
        pickle.dump(dictionary, f)


Inpt = raw_input('Option : ')
if Inpt == 'read':
    read()
else:
    dump()

OriginalEl autor MartinStone | 2013-12-17

2 Comentarios

  1. 8

    Cuando se abre un archivo en w modo (o wb), que dice que para escribir un nuevo archivo, borrar lo que ya estaba allí.

    Como el docs decir:

    El más comúnmente utilizado los valores de modo de ‘r’ para la lectura, ‘w’ para escribir (truncar el archivo si ya existe), y ‘a’ para anexar…

    En otras palabras, usted quiere usar 'ab', no 'wb'.


    Sin embargo, al anexar nuevos vertederos en el mismo archivo, se termina con un archivo compuesto de múltiples valores independientes. Si usted solo llame load una vez, se va a cargar la primera. Si desea cargar todos de ellos, usted necesita escribir el código que hace eso. Por ejemplo, usted puede load en un bucle hasta que EOFError.


    Realmente, esto se parece a lo que estamos tratando de hacer es no anexar al archivo pickle, pero a modificar la existente en escabeche diccionario.

    Que se podía hacer eso con una función que carga y combina todos los vertederos juntos, como esta:

    def Load():
        d = {}
        with open('test.txt', 'rb') as f:
            while True:
                try:
                    a = pickle.load(f)
                except EOFError:
                    break
                else:
                    d.update(a)
        # do stuff with d

    Pero que se va a poner más lento y más lento, más veces que se ejecute el programa, a medida que la pila en más y más copias de los mismos valores. Para hacer que derecho usted necesita para cargar el diccionario antiguo, modificar eso, y luego volcar la versión modificada. Y para eso, quiere w modo.

    Sin embargo, una forma mucho mejor para conservar un diccionario, al menos si las claves son cadenas, es el uso de dbm (si los valores son también cadenas) o guardar (de lo contrario) en lugar de un diccionario en el primer lugar.

    OriginalEl autor abarnert

  2. 0

    De abrir un archivo en "wb" modo trunca el archivo — que es, borra el contenido del archivo y, a continuación, le permite trabajar en él.

    Normalmente, tendría que abrir el archivo en append ("ab") modo de agregar datos al final. Sin embargo, Pepinillo no admite anexar, por lo que tendrá que guardar los datos en un nuevo archivo (subir con un nombre de archivo diferente: consultar con el usuario o el uso de un parámetro de línea de comandos, tales como -o test.txt?) cada vez que se ejecute el programa.

    Sobre un tema relacionado, no use Vinagre. Es peligroso. Considere el uso de JSON en lugar (en la norma lib — import json).

    La primera mitad de la respuesta es correcta… pero la segunda mitad es no. Pickle tiene soporte para anexar. Y como para «inseguros», si usted está tratando de ahorrar tipos además de flotador/str/lista/dict, JSON no puede hacerlo, a menos que se extienden, en cuyo caso se convierte en exactamente tan peligroso como la salmuera. Usted tiene que saber sus datos y cómo desea almacenar, o no existe ningún seguro de respuesta.
    No. El pepinillo es inherentemente peligroso (como el módulo de documentación de la toma gran cuidado para advertir contra, varias veces), y pickle.load ejecutar código arbitrario contenida en el curtido de archivo: michael-rushanan.blogspot.ca/2012/10/…
    Si no incluso el intento de entender por qué el pepinillo es peligroso, te vas a terminar de escribir un código que sólo inseguro el uso extendido JSON o de otra manera. Lo de la advertencia específicamente dice que es «El pepinillo módulo no está diseñado para ser seguro contra errónea o malintencionada construido de datos.» Si usted extender JSON para almacenar y restaurar clases personalizadas de una manera obvia, va a ser igual de inseguro contra errónea o malintencionada construido de datos.
    De manera más general: pickle, obviamente no es una bala de plata que resuelve todos los problemas. Pero tampoco es un completo inútil módulo que nunca debe ser usada. Si lo fuera, no estaría en la biblioteca estándar. La difusión de FUD sobre ella por ninguna razón, no hay uno bueno.

    OriginalEl autor Max Noel

Dejar respuesta

Please enter your comment!
Please enter your name here