在跨平台中使用Python shelve

11 投票
4 回答
3877 浏览
提问于 2025-04-17 09:24

我希望能得到一些关于Python中架构/数据库的建议。

问题是:我在Mac上创建了一个数据库,现在想在Windows 7上使用它。我用的是Python 3.2,MacOS 10.7和Windows 7。

当我在Mac上打开并保存我的架构时,一切都很好。我得到了一个后缀为“.db”的文件。但在我的Windows Python上,这个文件却无法识别。不过,我可以在电脑上创建一个新的数据库,得到后缀为“.bak、.dat、.dir”的文件。

我猜测Windows上的Python和Mac上的Python使用的底层数据库不一样?

我不太确定该怎么做,但也许我可以:

更改我系统使用的默认数据库?

找出我Mac上Python使用的数据库,并在电脑上添加它?

彻底改变我存储数据的方式?

速度不是问题,数据大小只有几兆,而且不常访问。

希望能找到能帮忙的人。提前感谢,任何帮助都非常感激。

/Esben

我正在做的事情:

Import shelve
db = shelve.open('mydb')
entries = db['list']
db.close

这很简单,我在Mac上有一个名为“mydb.db”的工作数据库文件,但当我尝试在Windows Python上打开它时,我得到了:

追踪(最近的调用最后): 文件 "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/dbm/init.py",第107行,在whichdb中 f = io.open(filename + ".pag", "rb") IOError: [Errno 2] 没有这样的文件或目录:'mydb.pag'

4 个回答

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}")
1

sqlite3模块是一个跨平台的模块,很多其他语言和工具也支持它。

pickle模块更简单,但同样是跨平台的。你只需要给它一个对象,它就会把这个对象保存到一个文件里。没有像sqlite那样的表格或行。

3

谢谢你的回复!

我发现,在Python中,使用shelves(一个存储数据的方式)并不容易强制指定某个数据库,不过pickles(另一种存储数据的方式)效果很好。至少在从Mac系统转到Windows 7的时候是这样的。

所以简单来说:如果你想让数据更方便地在不同地方使用,就别用shelves,直接用pickles。

/Esben

撰写回答