【问题标题】:Python 3 shelve hiding data?Python 3 搁置隐藏数据?
【发布时间】:2018-07-22 17:49:56
【问题描述】:

我从数据库中抓取了大量数据,并使用 Python 的 shelve 模块将其保存为 "first_database.db"(我使用的是 Python 3.4)。我之前遇到过shelve 的问题(请参阅my old issues),这可能是由于与我的古老操作系统(OSX 10.9.4)和gdbm/dbm.gnu 有关。

现在我遇到了一个更棘手的问题:我创建了一个 ~170 MB 的新文件,而现在 无论如何我只能访问一个键/值。强>

我知道可能的键的超集,并且尝试访问它们中的任何会给我一个KeyError(除了一个)。当我将不返回 KeyError 的单个键的值保存为新的搁置数据库时,它的大小只有 16 KB,所以我知道数据在 170 MB 文件中,但我无法访问它。

我是不是搞砸了?

此外,我已经制作了数据库的副本并尝试向其中添加更多键(~95)。 那个数据库会说它有三个键,但是当我尝试访问第三个键的值时,我收到以下错误:

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 114, in __getitem__ value = Unpickler(f).load() _pickle.UnpicklingError: invalid load key, ''.

【问题讨论】:

    标签: python python-3.x shelve dbm


    【解决方案1】:

    我不知道这个问题,但也许这个替代方案可能会帮助你:

    https://github.com/dagnelies/pysos

    它类似于shelve,但不依赖底层实现并将其数据保存为纯文本。这样,如果发生意外情况,您甚至可以打开 DB 文件来检查其内容。

    还要注意shelve 依赖于底层dbm 实现。这意味着如果您将搁置保存在 Linux 上,例如,如果它的 dbm 实现不同(有几个),您可能无法在 Mac 上读取它。

    【讨论】:

    • 谢谢。我最终只使用了 JSON,这实际上也使事情变得更容易,还有其他原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多