我经常需要从(通常是制表符分隔值)文件中读取数据并将它们转换为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并单独返回它,代码重复仍然存在。
我也玩过嵌套的字典理解并将分割线解包为变量,但遇到了不同的问题。
答案 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]