【发布时间】:2021-11-11 11:22:01
【问题描述】:
我正在尝试使用 HDF5 作为后端在 python 中编写键值存储。理想情况下,我希望商店表现得像一个 python 字典。我当前的代码现在看起来像这样
from multimethod import multimethod
from typing import List
import h5py
class FancyDic(MutableMapping):
def __init__(self, fname):
self.fname = fname
self.__store__ = h5py.File(fname,'w')
def get_dic(self, df):
data_dict = dict()
for col in df.columns:
if "coord" in col:
pass
else:
data_dict[col] = df[col].values
return data_dict
@multimethod
def update(self:object, path:str, key:str, value:float):
self.__store__[path + key] = value
@update.register
def _(self:object, path:str, key:str, value:np.ndarray):
self.__store__[path + key] = value
@update.register
def _(self:object, path:str, key:str, value:list):
self.__store__[path + key] = np.asarray(value)
@update.register
def _(self:object, path:str, key:str, value:str):
self.__store__.attrs[path+key] = value
@update.register
def _(self:object, path:str, key:str, value:List[str]):
self.__store__[path + key] = np.array(value).astype('|S100')
@update.register
def _(self:object, path:str, key:str, value:dict):
for key, item in value.items():
key = str(key)
if isinstance(item, pandas.core.frame.DataFrame):
data_dic = self.get_dic(item)
self.update(path+"/"+key,"/",data_dic )
else:
self.update(path+"/"+key,"/",item )
def __openfile__(self, fname):
self.__store__ = h5py.File(fname,'r+')
def closefile(self):
self.__store__.close()
# The next five methods are requirements of the ABC.
def __setitem__(self,path, key, value):
self.update(path, key, value)
def __getitem__(self, key):
if isinstance(key, int):
key = str(key)
return self.__store__[key]
def __delitem__(self, key):
del self.__dict__[key]
def __iter__(self):
return iter(self.__dict__)
def __len__(self):
return len(self.__dict__)
# The final two methods aren't required, but nice for demo purposes:
def __str__(self):
'''returns simple dict representation of the mapping'''
return str(self.__dict__)
当我尝试访问一个元素时,它可以工作,例如我可以做FancyDicObj[key] 等,但是当我这样做时,它会按预期返回一个 HDF5 组对象,我只能通过字符串键访问它。我也希望能够通过整数键访问元素。有没有办法引入一个函数,以便在这个键值存储中仍然可以通过整数键进行下标访问。例如 FancyDicObj[key][1] 而不是 FancyDicObj[key]["1"] 即使我将数据存储在数字键的字符串表示形式中。
【问题讨论】:
-
如果要对字典使用整数键,则需要使用整数创建。为什么你更喜欢整数而不是字符串?你想做什么?为什么不使用
FancyDicObj[key][str(1)]来获取整数值的字符串? -
因为它有点难看,而且这与 python 字典语法不兼容,我可以只使用整数键而不强制转换为字符串我的问题是我可以将花哨的 dicobj 包装在另一个类中并只使用整数像我使用 python 字典一样的键
-
因为 rifht 现在在第一级访问,我可以通过整数键访问,因为该类将整数键转换为字符串,而无需我告诉它在 hdf5 文件的较低嵌套级别它没有完成访问 fancydicobj 会返回没有整数键访问的组或数据集
标签: python hdf5 h5py key-value-store