[英]Using python shelve cross-platform
我希望對 Python 中的書架/數據庫有一些建議。
問題:我在 Mac 上創建了一個數據庫,我想在 Windows 7 上使用它。我使用 Python 3.2、MacOS 10.7 和 win 7。
當我在 Mac 上打開並保存我的書架時,一切都很好。 我得到一個帶有“.db”擴展名的文件。 在我的 windows-python 上,它無法識別。 但是,我可以在 PC 上創建一個新數據庫並獲取帶有“.bak、dat、.dir”擴展名的文件。
我猜電腦上的python沒有我的mac-python使用的相同底層數據庫?
我不確定這里哪種方法是正確的,但也許我可以:
更改我的系統使用的默認數據庫? 找出我的 mac-python 使用哪個數據庫並將其添加到 PC 上? 改變我存儲數據的方式?
速度不是問題,數據大小只有幾兆字節,而且訪問頻率不高。
希望能在那里找到幫助之手。 提前致謝 - 非常感謝任何幫助。
/埃斯本
我在做什么:
Import shelve
db = shelve.open('mydb')
entries = db['list']
db.close
很簡單,我在 mac 上有一個名為“mydb.db”的工作數據庫文件,但是當我嘗試在 pc-python 上打開它時,我得到:
回溯(最近通話最后一個):文件“/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/dbm/初始化的.py”,線路107,在whichdb F = io.open(文件名+“ .pag", "rb") IOError: [Errno 2] 沒有這樣的文件或目錄:'mydb.pag'
感謝你的回復!
我似乎在 python 中的架子不容易強制使用特定的數據庫,但是泡菜就像一個魅力。 至少從 mac os -> windows 7。
所以簡短的回答:如果你想要便攜,不要用架子,直接用泡菜。
/埃斯本
sqlite3 模塊是一個跨平台模塊,甚至被許多其他語言和工具支持。
pickle 模塊更簡單,但也是跨平台的。 你給它一個對象,它把它轉儲到一個文件中。 沒有像 sqlite 那樣的表或行。
我遇到了同樣的問題並實現了一個基於 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}")
您可以嘗試使用pysos ,它是一個輕量級的貨架替代品,也是跨平台的。
使用pip install pysos
: pip install pysos
用法示例:
import pysos
db = pysos.Dict('myfile.db')
db['hello'] = 'persistence!'
db.close()
優點還在於,所有內容都包含在這個單個文件myfile.db
因此您可以輕松地復制它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.