微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将Python搁置从dbm.gnu转换为dbm.dumb

如何解决将Python搁置从dbm.gnu转换为dbm.dumb

我正在尝试将存储在非哑式存储架中的数据转换为哑式存储架,以便能够在未安装非哑式存储库的位置访问我的数据。

我用于转换db数据的测试代码如下:

import numpy as np
import shelve
import dbm

# create test shelve
sample = list(range(0,10))
filename = 'test'
new_filename = 'test-dumb'

with shelve.open(filename) as data:
    data['sample'] = sample
print('current db type: ',dbm.whichdb(filename))


# test test shelve
with shelve.open(filename) as data:
    print('in current db: ',list(data.keys()))


# read test shelve
with shelve.open(filename) as data:
    # store in dumb format
    with dbm.dumb.open(new_filename) as dumb_data:
        dumb_data = data
        print('in new db: ',list(dumb_data.keys()))
print('\nnew db type: ',dbm.whichdb(new_filename))


# check dumb shelve
with dbm.dumb.open(new_filename) as dumb_data:
    print(list(dumb_data.keys()))
    if dumb_data['sample'] == sample:
        print('success: ',sample)
    else:
        print('not yet: ',sample)

输出如下:

current db type:  dbm.gnu
in current db:  ['sample']
in new db:  ['sample']
new db type:  dbm.dumb
[]
Traceback (most recent call last):
  File "/home/asdf/anaconda3/envs/phievo/lib/python3.7/dbm/dumb.py",line 153,in __getitem__
    pos,siz = self._index[key]     # may raise KeyError
KeyError: b'sample'

我在做什么错了?

解决方法

您需要遍历原始数据库的键,并分配:

dumb_data = data

只需使用指向dumb_data的“指针”覆盖data变量即可。

程序应如下所示:

import numpy as np
import shelve
import dbm

...

# copy data into dumb
with shelve.open(filename) as data:
    # store in dumb format
    with dbm.dumb.open(new_filename) as dumb_data:
        for key,value in data.items():
            dumb_data[key] = value
        print('in new db: ',list(dumb_data.keys()))

我只是将分配替换为:

for key,value in data.items(): 
    dump_data[key] = value`

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。