使用字典理解从文件中读取

Reading from file using dict comprehensions

我经常需要从(通常是制表符分隔值)文件中读取数据并将它们转换为字典。通常我只需要将其中一列映射到另一列,但也可能会对值进行一些处理(例如去除空格)。我一直在尝试想出一个 dict 理解模式来做到这一点,但我将 运行 放入一些小麻烦中,这些小麻烦使我无法始终如一地以最简洁和易于理解的方式实施它。而且我觉得可能有更好的方法。

下面是我尝试过的(一些)方法,以及它们出错的地方:


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)

我刚想到这个。它非常适用于这种简单情况(仅将第一列映射到第二列,不进行任何处理),但不能推广到其他情况。很难进行额外的处理,并且使用的列必须相邻。也不是严格的dict comprehension,不能转化为一个,因为它使用的是slice。


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

当然,我可以先创建字典,然后更新每一行。但是现在我必须分别创建 dict 和 return 它,代码重复仍然存在。


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

你可以通过在你的 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)}

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

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]