python:将文本文件转换为字典

时间:2014-01-08 00:14:18

标签: python dictionary

我有一个文本文件名xrb.txt,前几行看起来像这样 -

1   N.A.    9.10    9.66 
2   N.A.    8.20    8.48 
3   N.A.    8.70    8.11  
4   6.34    4.60    4.39 
5   6.07    <5.74   4.35 
6   N.A.    5.10    4.42 
7   2.92    3.20    2.05 
8   <1.25   1.44    0.72 

我需要创建一个字典,第一列(即1,2,3 ......)作为键,其他行作为每个键的值。

在python中有一种简单的方法吗?

我正在尝试以下操作,但它无法正常工作,我确信我的工作有点太复杂了:

xrbdic = {}

f = open("xrb.txt")
for line in f:
    line = line.strip()
    pa = [p.strip() for p in line.split()]
    xrbdic[parts[0]] = (pa[1], pa[2], pa[3])

3 个答案:

答案 0 :(得分:4)

你的代码不起作用的唯一原因是愚蠢的错字:

xrbdic[parts[0]] = (pa[1], pa[2], pa[3])

这会在NameError上引发parts,因为没有这样的变量。将其更改为pa,您就可以得到您要求的字典。


与此同时,你并没有过分复杂的事情。但是你可以简化一下吗?肯定。

首先,line.split()已经剥离了分割部分之间的所有空白,因此您无需单独剥离它们。

这包括尾随换行符,因此您也不需要使用行宽条带。

其次,您可以使用切片而不是显式列出所有部件。

虽然我们正在使用它,但你永远不会close该文件,除了快速和肮脏的脚本之外什么都不会立即退出。您可以使用with语句使其更简单。

所以:

xrbdic = {}
with open("xrb.txt") as f:
    for line in f:
        pa = line.split()
        xrbdic[pa[0]] = pa[1:]

然后很容易将整个事物变成一个词典理解:

with open('xrb.txt') as f:
    xrbdic = {pa[0]: pa[1:] for pa in map(str.split, f)}

答案 1 :(得分:1)

您需要将代码中的最后一行更改为以下内容。

xrbdic[pa[0]] = (pa[1], pa[2], pa[3])

你写了部分,实际上你应该写了pa。

答案 2 :(得分:0)

词典理解可能是一个更惯用的答案。

with open('xrb.txt','r') as f:
    text = f.readlines()

###please ignore
#xrbdic = {p.split()[0]:(p.split()[1],p.split()[2],p.split()[3]) for p in raw_text}
##old ugly one-liner

rows = [line.split() for line in lines]
xrbdic = {row[0]:(row[1],row[2],row[3]) for row in rows}