使用dict理解从文件中读取

时间:2016-02-05 16:16:19

标签: python dictionary dictionary-comprehension

我经常需要从(通常是制表符分隔值)文件中读取数据并将它们转换为dicts。通常我只需要将其中一列映射到另一列,但也可以对值进行一些处理(例如剥离空白)。我一直试图想出一个字典理解模式来做到这一点,但我一直遇到小麻烦,这使我无法以最简洁和最容易理解的方式实现它。我觉得可能有更好的方法。

所以这里有一些我试过的方法,以及它们出错的地方:

with open(path) as f:
    return {line.split("\t")[0].strip(): line.split("\t")[1].strip()
            for line in f}

这是我经常最终使用的。它允许我在适当的位置修改键和值,并且可以在任何列上工作(例如,如果我想将值从第三列映射到第一列)。显而易见的问题是line.split()部分的重复。有没有办法将line.split("\t")绑定到临时变量,或者将值直接解压缩到变量中?

with open(path) as f:
    return dict(line.split("\t")[:2] for line in f)

我想出了这个。它适用于这种简单的情况(只是映射第一列到第二列,没有任何处理),但不会推广到其他情况。难以进行额外的处理,所使用的列必须相邻。它也不是一个严格的字典理解,也不能变成一个,因为它正在使用切片。

d = dict()
for line in open(path):
    d.update({line.split("\t")[0]: line.split("\t")[1]})
return d

当然,我可以先创建dict,然后用每行更新。但是现在我必须创建dict并单独返回它,代码重复仍然存在。

我也玩过嵌套的字典理解并将分割线解包为变量,但遇到了不同的问题。

2 个答案:

答案 0 :(得分:0)

你可以通过在f

周围加一些东西来做到这一点
def tabsplit(file_object):
    for line in file_object:
        yield line.split("\t")

然后是:

with open(path) as f:
    return {left.strip(): right.strip() for left, right, *rest in tabsplit(f)}

答案 1 :(得分:0)

不确定为什么首先创建字典不起作用

result = {}
with open(path) as f:
    for line in f:
        columns = line.split("\t")
        key = columns[0] # first item is the key right?
        result[key] = columns[1]