Zek*_*eke 5 python dictionary shelve dbm python-3.x
我一直在使用Python的shelve模块(在OSX 10.9.5上使用Python 3.4)将一堆字典保存到文件中.每个key都是一个int(例如,"84554")的字符串,每个都是一些字符串的value字典.
没有键被使用两次,我知道所有可能键的总超集.我将这些键值对添加到shelfvia线程中,每次运行时都会添加哪些键/值(这是预期的).
我遇到的问题是使用shelve's 可迭代/可见的键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 = []
Run Code Online (Sandbox Code Playgroud)
然后我打开架子,计算我迭代的所有键数db.keys(),将"好"键添加到列表中.
db = shelve.open(MAIN_PATH + "first_3")
for k in db.keys():
c2+=1
good_keys+=[k]
Run Code Online (Sandbox Code Playgroud)
然后,我检查每个可能的钥匙,看它是否在架子上,检查架子上是否存在,并做同样的事情.
for j in set(ids):
if j in db.keys():
c+=1
bad_keys+=[j]
Run Code Online (Sandbox Code Playgroud)
两个计数器,c并且c2,应该是相同的,但这样做:
print("With `db.keys()`: {0}, with verifying from the list: {1}".format(c2, c))
Run Code Online (Sandbox Code Playgroud)
收益率:
With `db.keys()`: 628, with verifying from the list: 669
Run Code Online (Sandbox Code Playgroud)
然后我查看已经存在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'
Run Code Online (Sandbox Code Playgroud)
然后我检查以下内容:
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
Run Code Online (Sandbox Code Playgroud)
请注意,最后检查.有人知道是什么给出的吗?我认为shelves应该很容易,但它一直给我完全的地狱.
也许unrelatedly(但也许不是),当我让条目的更大数量的堆积在货架,并尝试做一些像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
Run Code Online (Sandbox Code Playgroud)
但仍然可以通过尝试所有可能的密钥来访问数据.显然那是因为我没有使用gdbm?
小智 1
当我尝试在架子中保存一些包含超过 1000 个元素的 numpy 数组时,它只会保存一些并完全跳过其他数组,而不会生成错误。
显然,这是在 Mac OSX 中使用 Shelve 时出现的问题(这里有一些错误报告(https://bugs.python.org/issue33074、https://bugs.python.org/issue30388)。
我发现的唯一简单的解决方案是使用Pickle 而不是 Shelve。
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |