Estantería de Python con artículos que no están listados

He estado guardando un montón de diccionarios en el archivo utilizando el módulo de archivado de Python (con Python 3.4 en OSX 10.9.5). Cada key es una cadena de un int (por ejemplo, "84554" ), y cada value es un diccionario de diccionarios de unas pocas cadenas pequeñas.

No se usan las teclas dos veces, y sé el superconjunto total de todas las teclas posibles. Estoy agregando estos pares clave-valor al shelf través de subprocesos y las claves / valores que se agregan cambian cada vez que lo ejecuto (lo que se espera).

El problema que he tenido es que la cantidad de teclas iterables / visibles con shelf.keys() ‘s shelf.keys() y la cantidad de teclas únicas para las cuales la key in shelf.keys() es diferente.

Aquí está mi código. Primero inicializo las cosas y ids , que es la lista de todas las claves posibles.

 import shelve from custom_code import * MAIN_PATH = "/Users/myname/project_path/src/" ids = list(set(load_list(MAIN_PATH + "id_list.pkl"))) c = c2 = 0 good_keys = [] bad_keys = [] 

Luego abro el estante, contando todo el número de claves que db.keys() con db.keys() , agregando las claves “buenas” a una lista.

     db = shelve.open(MAIN_PATH + "first_3") for k in db.keys(): c2+=1 good_keys+=[k] 

    Luego, reviso cada clave posible para ver si está en el estante, verificando si existe en el estante y haciendo lo mismo que arriba.

     for j in set(ids): if j in db.keys(): c+=1 bad_keys+=[j] 

    Los dos contadores, c y c2 , deberían ser iguales, pero haciendo:

     print("With `db.keys()`: {0}, with verifying from the list: {1}".format(c2, c)) 

    rendimientos

     With `db.keys()`: 628, with verifying from the list: 669 

    Luego miro las claves que estaban en bad_keys pero no good_keys (es decir, recostackdas de db.keys() ) y escojo un ejemplo.

     odd_men_out = list( set(bad_keys).difference( set(good_keys) ) ) bad_key = odd_men_out[0] print(bad_key) # '84554' 

    Entonces reviso lo siguiente:

     print(bad_key in db.keys()) # True print(bad_key in db) # True print(db[bad_key]) # A dictionary of dictionaries that wraps ~12ish lines print(bad_key in list(db.keys())) # False 

    Tenga en cuenta que la última comprobación. ¿Alguien sabe lo que da? Pensé que los shelves deberían ser fáciles, pero me han estado dando un completo infierno.

    Quizás sin relación (pero tal vez no), cuando dejo un número aún mayor de entradas en el estante y trato de hacer algo como for k in db.keys() o list(db.keys()) , list(db.keys()) el siguiente error :

      File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/_collections_abc.py", line 482, in __iter__ yield from self._mapping File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 95, in __iter__ for k in self.dict.keys(): SystemError: Negative size passed to PyBytes_FromStringAndSize 

    Pero todavía puede acceder a los datos al intentar todas las claves posibles. Evidentemente eso es porque no estoy usando gdbm ?