我使用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]
两个计数器c
和c2
应该相同,但这样做:
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
?