使用python搁置跨平台
Posted
技术标签:
【中文标题】使用python搁置跨平台【英文标题】:Using python shelve cross-platform 【发布时间】:2012-01-02 19:46:57 【问题描述】:我希望对 Python 中的书架/数据库有一点建议。
问题:我在 mac 上创建了一个数据库,我想在 windows 7 上使用它。我使用 Python 3.2、MacOS 10.7 和 win 7。
当我在 Mac 上打开并保存我的书架时,一切都很好。我得到一个扩展名为“.db”的文件。在我的 windows-python 上它无法识别。但是,我可以在 pc 上创建一个新数据库并获取带有“.bak、dat、.dir”扩展名的文件。
我猜pc上的python没有我的mac-python使用的同一个底层数据库?
我不确定这里的正确方法是什么,但也许我可以:
更改我的系统使用的默认数据库? 找出我的 mac-python 使用哪个 db 并将其添加到 pc 上? 改变我将数据存储在一起的方式?
速度不是问题,数据大小为几兆,访问频率不高。
希望能在那里找到帮助。提前致谢 - 非常感谢任何帮助。
/埃斯本
我在做什么:
Import shelve
db = shelve.open('mydb')
entries = db['list']
db.close
这很简单,我在 mac 上有一个名为“mydb.db”的工作 db 文件,但是当我尝试在 pc-python 上打开它时,我得到:
Traceback(最近一次调用最后一次): 文件“/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/dbm/init.py”,第107行,其中db f = io.open(文件名 + ".pag", "rb") IOError: [Errno 2] 没有这样的文件或目录:'mydb.pag'
【问题讨论】:
你说它在 Windows 上无法识别是什么意思?你是如何尝试打开文件的?你能展示一些示例代码吗? 【参考方案1】:感谢您的回复!
我似乎并不容易强迫 python 中的书架使用特定的数据库,但是泡菜就像一个魅力。至少从 mac os -> windows 7.
这么简短的回答:如果你想要便携性,不要使用货架,直接使用泡菜。
/埃斯本
【讨论】:
【参考方案2】:sqlite3 模块是一个跨平台模块,甚至被许多其他语言和工具支持。
pickle 模块更简单,而且是跨平台的。你给它一个对象,它会将它转储到一个文件中。没有像 sqlite 这样的表或行。
【讨论】:
泡菜可能是要走的路。我只是喜欢将所有内容放在一个文件中的想法。是不是可以强制 Python 使用特定的 db 进行搁置,即跨平台? 您不应该遇到任何文件名问题,因为您将自己处理这些问题。【参考方案3】:我遇到了同样的问题,并实现了一个基于 dict 的类,该类支持从磁盘加载和写入 dict 的内容。
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")
【讨论】:
【参考方案4】:您可以尝试使用 pysos,它是一种轻量级的搁置替代方案,也是跨平台的。
使用 pip 安装:pip install pysos
示例用法:
import pysos
db = pysos.Dict('myfile.db')
db['hello'] = 'persistence!'
db.close()
优点还在于所有内容都包含在这个单个文件myfile.db
中,因此您可以轻松地复制它。
【讨论】:
以上是关于使用python搁置跨平台的主要内容,如果未能解决你的问题,请参考以下文章