python - 如何从可能损坏或太大的 Python Shelve 数据库中恢复数据?

我一直在使用 Shelve 作为文档存储。 键是一个字符串化的整数,值只是字符串中的一些 html。不幸的是,我的脚本最终在数据库中放入了太多条目,以至于发生了错误(我手头没有确切的条目)。数据库的大小约为 36GB,现在当我加载它然后尝试迭代键或类似的东西时,我收到以下错误...

import shelve

db = shelve.open("my.shelf")
ks = db.keys()
for k in ks: print(k)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  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

>>> list(ks.__dict__.values())[0].dict
<_dbm.dbm object at 0x10037ef90>
>>> help(list(ks.__dict__.values())[0].dict)

>>> list(ks.__dict__.values())[0].dict.keys()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
SystemError: Negative size passed to PyBytes_FromStringAndSize

这是在 OSX Yosemite 上。 Python 3.4

有什么方法可以修复此问题或取出键和值以放置在更合适的商店中?

最佳答案

您必须知道其对应对象已成功存储的键名。

因为保存数据对象失败会损坏您的数据库。

然后,

db = shelve.open("my.shelf") 对于 list_of_successfully_saved_obj's_name 中的键: val = db.get(键) ...

https://stackoverflow.com/questions/27294465/

相关文章:

android - 如何在 Android Studio 中为单元测试设置自定义可绘制目录

java - twitter4j : Update filter of a running Stre

python - 将颜色条添加到 python 子图中,其中数据点的颜色取决于未绘制的第三个变量

java - spring @RequestParam Unicode 不正确

ruby-on-rails - Rails 更新三向连接表

java - Web 服务连接被拒绝

django - 在管理员中将动态字段添加到 Django 的 export_as_csv 操作

ruby-on-rails - Rails ActiveRecord checkout_timeou

java - 如何获得 PST 电子邮件地址和姓名?

python - 如何在 scrapy 契约(Contract)中向请求添加属性