如何在Python中读取一个键但多个值的文件

时间:2017-11-26 00:25:45

标签: python dictionary

我刚刚开始使用Python并且有点困惑。我理解字典的基本思想是(键,值)。我正在编写一个程序,想要读入一个文件,在字典中讲故事,然后通过引用值来完成不同的功能。我不确定我是否应该使用字典或列表。该文件的基本布局是: 名称后跟12个不同年份,例如: A 12 12 01 11 0 0 2 3 4 9 12 9

我不确定阅读此信息的最佳方式是什么。我以为如果我的名字后跟年份,字典可能会有所帮助,但我不确定我是否可以将12年映射到一个关键名称。我真的很困惑如何做到这一点。我可以逐行读取文件,但不能在字典中读取。

def readInFile():
    fileDict ={"Name ": "Years"}
    with open("names.txt", "r") as f:
        _ = next(f)
        for line in f:
                if line[1] in fileDict:
                    fileDict[line[0]].append(line[1])
                else:
                    fileDict[line[0]] = [line[1]]

我对这段代码的想法是每年追加价值。 如果您有任何建议,请告诉我。

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以在一行中完成:)

print({line[0]:line[1:].split() for line in open('file.txt','r') if line[0]!='\n'})

输出:

{'A': ['12', '12', '01', '11', '0', '0', '2', '3', '4', '9', '12', '9']}

以上词汇理解与:

相同
dict_1={}
for line in open('legend.txt', 'r'):
    if line[0]!='\n':
        dict_1[line[0]]=line[1:].split()

print(dict_1)

答案 1 :(得分:0)

您可以将12年映射到一个键名称。你似乎认为你需要在字典和列表之间进行选择(“我不确定我是否应该使用字典或列表。”)但这些不是替代品。你的12年可以有用地表示为一个列表。你的名字可以是字典键。因此,您需要(如PM 2Ring建议的那样)一个字典,其中是一个名称,而是一个年份列表。

def readInFile():
    fileDict = {}
    with open(r"names.txt", "r") as f:
        for line in f:
            name, years = line.split(" ",1)
            fileDict[name] = years.split()

对字符串方法split()进行两次调用。第一个将名称与第一个空间的年份分开。 (您可以使用line[0]获取名称,但前提是该名称长度为一个字符,并且对于实际数据不太可能有用。)第二次调用split()选择相隔年份并放置他们在一个列表中。

单行示例文件的结果与运行此文件的结果相同:

fileDict = {'A': ['12', '12', '01', '11', '0', '0', '2', '3', '4', '9', '12', '9']}

正如您所看到的,这些年是字符串而不是整数:您可能想要转换它们。

而不是:

_ = next(f)

扔掉你的记录数,考虑做

for line in f:
    if line.strip().isdigit():
        continue

代替。如果您使用file的内置迭代(for line in f),那么通常最好不要自己在next()上致电f

我也不清楚为什么你的代码会这样做:

fileDict ={"Name ": "Years"}

这是对您计划放入字典的内容的描述,但这不是字典的工作方式。它们不是具有命名列的数据库表。如果您使用带有键的字典: name 和值:年份列表,则该结构为隐式。您可以做的最好的事情是在注释或类型注释中描述它。执行分配将导致:

fileDict = {
           'A': ['12', '12', '01', '11', '0', '0', '2', '3', '4', '9', '12', '9'],
           'Name ': 'Years'
           }

混合了描述和数据,可能不是你想要的,因为你的后续代码可能期望在字典值中有12个年份列表,如果是这样,它会阻塞字符串{{1} }。