使用Python shelve跨平台

11
我希望能得到关于Python中的 shelves/数据库的一些建议。
问题:我在Mac上创建了一个数据库,想在Windows 7上使用它。我使用的是Python 3.2、MacOS 10.7和Win 7。
当我在Mac上打开并保存我的 shelve 时一切都很好。我得到一个扩展名为“ .db”的文件。但是在我的Windows-Python上它没有被识别。不过我可以在PC上创建新的数据库,并获得扩展名为“ .bak,dat,.dir”的文件。
我猜测PC上的Python没有与Mac上使用的相同的基础数据库?
我不确定这里应该采取哪种正确的方法,但也许我可以:
改变系统使用的默认数据库? 找出我的Mac-Python使用的数据库并将其添加到PC上? 完全改变我的数据存储方式?
速度不是问题,数据大小只有几兆字节,并且不经常访问。
希望能在这里找到帮助之手。提前致谢 - 任何帮助都会受到高度赞赏。
/ Esben
Import shelve
db = shelve.open('mydb')
entries = db['list']
db.close

很简单,我在Mac上有一个名为“mydb.db”的工作数据库文件,但是当我尝试在PC-Python上打开它时,我得到了以下错误消息:

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/dbm/init.py", line 107, in whichdb f = io.open(filename + ".pag", "rb") IOError: [Errno 2] No such file or directory: 'mydb.pag'


当你说它在Windows上无法识别时,你是什么意思?你是如何尝试打开文件的?你能展示一些示例代码吗? - Michael Mior
4个回答

3
感谢您的回复!
看起来在Python中强制使用特定数据库的货架不太容易,但是Pickles非常好用。至少从Mac OS到Windows 7都可以使用。
简短的答案是:如果您想要可移植性,请不要使用货架,直接使用Pickles。
/Esben

1

sqlite3模块是一个跨平台的模块,甚至被许多其他语言和工具支持。

pickle模块更简单,也是跨平台的。你只需要给它一个对象,它就会将其转储到文件中。没有像sqlite那样的表或行。


Pickle可能是最好的选择。我只是喜欢把所有东西都放在一个文件中的想法。 难道不能强制Python使用特定的数据库来进行架子操作,以实现跨平台吗? - Esben
你不应该遇到任何pickle文件名问题,因为你将自己处理这些问题。 - kichik

1

您可以尝试使用 pysos,它是一个轻量级的 shelve 替代品,也支持跨平台。

使用 pip 进行安装:pip install pysos

示例用法:

import pysos

db = pysos.Dict('myfile.db')
db['hello'] = 'persistence!'
db.close()

优点还在于所有内容都包含在单个文件myfile.db中,因此您可以轻松地将其复制到其他位置。

1
我遇到了同样的问题,并实现了一个基于字典的类,支持从磁盘加载和写入字典内容。
from pathlib import Path
import pickle


class DiskDict(dict):
    def __init__(self, sync_path: Path):
        self.path = sync_path

        if self.path.exists():
            with open(self.path, "rb") as file:
                tmp_dct = pickle.load(file)
                super().update(tmp_dct)
                print(f"loaded DiskDict with {len(tmp_dct)} items from {self.path}")

    def sync_to_disk(self):
        with open(self.path, "wb") as file:
            tmp_dct = super().copy()
            pickle.dump(tmp_dct, file)
            print(f"saved DiskDict with {len(tmp_dct)} items to {self.path}")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接