读取文件中的多行,并同时分离它们的值,以将其存储在字典中

时间:2014-09-16 22:46:59

标签: python file python-2.7 dictionary

您好我是python的初学者。 我有以下文件为“test.txt”

1 2 5
2 6 7

as so on .....

我想读取值并将其存储到字典中 我提出了以下代码,但它不起作用 因为[x.split(' ') for x in edges.readline().rstrip().split(' ')]只能访问文件的一行。 此外,这将返回无法应用int()类型转换的列表。 它可以在一个循环中访问多行,但我想知道pythonic的方法来做到这一点。

connection = {(int(source),int(dest)):int(weight) for source,dest,weight in [x.split(' ') for x in edges.readline().rstrip().split(' ')]}

请您建议正确的方法来阅读此类文件,然后将其存储在字典中。 感谢。

1 个答案:

答案 0 :(得分:1)

如果有点长,这里的词汇理解很干净:

with open("test.txt") as f:
  connection = {(a, b) : c for a,b,c in (map(int, line.split()) for line in f)}

请注意,使用生成器表达式迭代文件中的行而不是列表兼容性 - (map(int, line.split()) for line in f) vs [map(int, line.split()) for line in f]。这使我们可以避免将所有文件内容存储在内存中,如果文件很大,这可能很重要。

map用于将line.split()返回的所有字符串转换为整数。我认为在这里使用map比同等列表理解更好:[int(x) for x in line.split()]

这里的逻辑分解为各个部分:

connection = {}
with open("test.txt") as f:
    for line in f:
        a,b,c = map(int, line.split())
        connection[(a,b)] = c

要真正与dict理解等效,我们需要创建一个生成器函数来迭代文件:

def f_it(f):
    for line in f:
        yield map(int, line.split())

connection = {}
with open("test.txt") as f:
    for a,b,c in f_it(f):
        connection[(a,b)] = c