读取Python中每行以冒号分隔的数据

时间:2015-02-07 18:32:24

标签: python text-files

我正在创建一个具有用户名称的程序,以及他们在数据库中猜测数字游戏的答案 - 就像Python上的格式一样。我创建了一个文本文件,其中包含所有用户'数据的形式为:guess。例如,

Dave:23
Adam:12
Jack:13
Dave:25
Adam:34

现在,我试图将文件作为元组重新读入Python,所以我决定使用下面的代码行(真正的答案是17):

dict(line.split(':', 1) for line in open('guesses.txt'))

但是这只会让我回到空闲的空行。
为什么这不起作用?
为了使它更简单,我需要一个具有用户名称然后猜测的元组。

我的字典应如下所示:

{'Dave': 23 25, 'Jack' : 13, 'Adam' : 13 34}

谢谢,德尔伯特。

2 个答案:

答案 0 :(得分:3)

from collections import defaultdict

result = defaultdict(list)
with open("guesses.txt") as inf:
    for line in inf:
        name, score = line.split(":", 1)
        result[name].append(int(score))

让你

# result
{ "Dave": [23, 25], "Jack": [13], "Adam": [12, 34] }

答案 1 :(得分:1)

使用defaultdict并将值存储在列表中:

s="""Dave:23
Adam:12
Jack:13
Dave:25
Adam:34
"""

from collections import defaultdict
d = defaultdict(list)

for line in s.splitlines():
    name,val = line.split(":")
    d[name].append(int(val))

print(d)
defaultdict(<class 'list'>, {'Jack': [13], 'Adam': [12, 34], 'Dave': [23, 25]})

因此,对于您的文件,请执行相同的操作:

d = defaultdict(list)
with open('guesses.txt') as f:
    for line in f:
        name,val = line.split(":")
        d[name].append(int(val))

你自己的代码应返回{'Jack': '13', 'Dave': '25', 'Adam': '34'},其中Dave和Adam的值在最后两行被覆盖,因此需要在列表中存储值并附加。

由于元组不可变,每次要添加新值时,也不能像在答案中提到的那样使用元组而不创建新元组。

如果您不想要print(dict(d))

,可以pprint或使用defaultdict(<class 'list'>,)
from pprint import pprint as pp

pp(d)
{'Adam': ['12', '34'],
 'Dave': ['23', '25'],
 'Jack': ['13']}