[英]How to drive space separated values file with shelve
我有一个巨大的文件,其中包含以空格分隔的值,格式如下:
key1 0.553 1.45 0.666
key2 2.66 1.77 0.001
...
我想使用Shelve(或您建议的任何其他最合适的模块)将其作为字典驱动。 通过这种方式,我可以查询第一列作为键,结果可以是所有后续值作为列表,即
In [1]: with shelve.open("file") as db:
...: print db["key2"]
...:
Out [1]: [2.66, 1.77, 0.001]
非常感谢您的支持。
评论 :...一种有效的方法来提高文件末尾附近项目的检索效率?
添加offset
参数。
如果您将逻辑实现到class DictFloatReader
,则可以自动化。
def __getitem__(self, item): offset = 0 if isinstance(item, tuple): offset = item[1] item = item[0] self.fh.seek(offset) # Usage print(db["key2", 300*1024])
如果您的keys
是预先排序的 ,例如1、2、3、4或a,b,c,则可以使用btree
搜索。 这样每个key
搜索时间几乎相同。
切换到提供索引和随机访问的真实数据库文件格式。
将其保存在内存中 ,但您已经声明:
“无法保留在内存中”
这将满足您的要求,例如:
class DictFloatReader(object):
def __init__(self, fpath):
self.fpath = fpath
self.fh = None
def __enter__(self):
self.fh = open(self.fpath)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.fh.close()
def __getitem__(self, item):
self.fh.seek(0)
for line in self.fh:
if line.startswith(item):
return [float(f) for f in line[:-1].split(' ')[1:]]
用法
with DictFloatReader('file') as db:
print(db["key2"])
print(db["key1"])
print(db["key2"])
产量
[2.66、1.77、0.001]
[0.553、1.45、0.666]
[2.66、1.77、0.001]
使用Python:3.4.2和2.7.9测试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.