Python搁置的物品没有列出

时间:2018-04-01 05:14:26

标签: python python-3.x dictionary shelve dbm

我使用Python的shelve模块(在OSX 10.9.5上使用Python 3.4)将一堆词典保存到文件中。每个key是一个int的字符串(例如,"84554"),每个value是一些字符串的字典。

没有键被使用两次,我知道所有可能键的总超集。我将这些键值对通过线程添加到shelf,并且每次运行时都会添加更改的键/值(这是预期的)。

我遇到的问题是shelve shelf.keys()可迭代/可见的密钥数量以及key in shelf.keys()的唯一密钥数量不同。

这是我的代码。我首先初始化并加载ids,这是所有可能键的列表。

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 = []

然后我打开架子,计算我用db.keys()迭代的所有键数,添加"好"列表的键。

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

然后,我检查每个可能的钥匙,看看它是否在架子上,检查它是否存在于架子上,并做同样的事情。

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

两个计数器cc2应该相同,但这样做:

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

的产率:

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

然后我会查看bad_keys但不是good_keys中的密钥(即从db.keys()收集的)并选择一个示例。

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

然后检查以下内容:

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

请注意上次检查。有人知道是什么给出的吗?我认为shelves应该很容易,但是它给了我完整的地狱。

也许无关(但也许不是),当我让更多数量的条目累积在架子上并尝试执行for k in db.keys()list(db.keys())之类的操作时,我收到以下错误:

  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

但仍可以通过尝试所有可能的密钥来访问数据。很明显,因为我没有使用gdbm

0 个答案:

没有答案