繁体   English   中英

如何用搁置来驱动空格分隔的值文件

[英]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]

非常感谢您的支持。

评论 :...一种有效的方法来提高文件末尾附近项目的检索效率?

  1. 添加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]) 
  2. 如果您的keys预先排序的 ,例如1、2、3、4或a,b,c,则可以使用btree搜索。 这样每个key 搜索时间几乎相同。

  3. 切换到提供索引随机访问真实数据库文件格式。

  4. 将其保存在内存中 ,但您已经声明:
    “无法保留在内存中”


这将满足您的要求,例如:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM