【问题标题】:Python: file contents to dictionaryPython:文件内容到字典
【发布时间】:2016-03-08 16:00:53
【问题描述】:

编写一个函数,接受一个 CSV 文件的文件名(字符串) 包含有关学生姓名和成绩的信息 四门课程并返回信息字典。的钥匙 字典应该是学生的名字和值 应该是他们成绩的浮点数列表。为了 例如,如果文件的内容如下所示:

Mark,90,93,60,90
Abigail,84,50,72,75
Frank,46,83,53,79
Yohaan,47,77,74,96

那么你的函数应该返回一个字典,例如:

out_dict = {'Frank': [46.0, 83.0, 53.0, 79.0],
            'Mark': [90.0, 93.0, 60.0, 90.0],
            'Yohaan': [47.0, 77.0, 74.0, 96.0],
            'Abigail': [84.0, 50.0, 72.0, 75.0]}

这是我的代码:

def dict_from_file (file_name):
    file_pointer = open(file_name, 'r')
    data = file_pointer.readlines()
    print (data)
    output_dict = {}
    for line in data:

    file_pointer.close()
    return (output_dict)

#Main Program
file_name = input("Enter the exact file name with its extension (.i.e., .txt): ")
result = dict_from_file (file_name)
print (result)

如您所见,for 循环中缺少语句。问题是我找不到任何逻辑来首先从文件中获取输入并将其粘贴到字典中。如果我打算提取每行一次,我将如何将其添加到字典中,名称为键,四个数字为值?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    严格关注您的代码:

    如果你打印出你读过的东西,你会发现你有这个:

    ['Mark,90,93,60,90\n', 'Abigail,84,50,72,75\n', 'Frank,46,83,53,79\n', 'Yohaan,47,77,74,96']
    

    因此,当您遍历列表中的每个项目时,为使此示例简单,您几乎可以提取第一个项目,这现在将成为您的键,然后取出列表中不包括名称的部分并将每个项目转换为浮点数。

    所以,你几乎正在寻找:

    l = line.split(',')
    output_dict[l[0]] = map(float, l[1:])
    

    上面发生的情况是,您正在通过拆分“,”来获取您正在迭代的每个项目,使其成为一个列表。然后,您将获取列表中的第一项并将其作为您的密钥。然后要分配您的值,您必须使用map 方法,该方法会将您的list 中的每个项目映射到一个浮点数。

    您将为正在读取的每个 line 执行该操作。

    所以,最后,你将拥有:

    def dict_from_file (file_name):
        file_pointer = open(file_name, 'r')
        data = file_pointer.readlines()
        print (data)
        output_dict = {}
        for line in data:
            l = line.split(',')
            output_dict[l[0]] = map(float, l[1:])
        file_pointer.close()
        return output_dict
    
    #Main Program
    result = dict_from_file ('stuff.txt')
    print (result)
    

    运行该代码,将为您提供:

    {'Frank': [46.0, 83.0, 53.0, 79.0], 'Yohaan': [47.0, 77.0, 74.0, 96.0], 'Abigail': [84.0, 50.0, 72.0, 75.0], 'Mark': [90.0, 93.0, 60.0, 90.0]}
    

    【讨论】:

    • 我建议将此答案(多列)和使用 CSV 阅读器的 srowland 结合起来。对于一个完全有效的 CSV 行,此解决方案将失败,例如:"Smith, John",10,10,10,10
    • @brianpck 够公平的。考虑到所提供的数据结构,将解决方案放在一起。 OP 可以利用他们希望从解决方案中得到的东西。 :)
    • 其实我只是在学习python,所以我需要熟悉内置函数及其使用。非常感谢您的解决方案。
    • @KaranThakkar 不要忘记接受您认为最有帮助的解决方案。它有助于向其他用户表明您为问题选择的解决方案解决了您的问题。
    • @KaranThakkar 无需道歉。 :) 只是一个善意的提醒。并感谢您接受。
    【解决方案2】:

    我建议你使用 csv 阅读器:

    import csv
    with open(file_name, 'rb') as csvfile:
        csv_reader = csv.reader(csvfile)
        for row in csv_reader:
            output_dict[row[0]] = [float(n) for n in row[1:]]
    

    如果正确插入你的 for 循环,这样的东西应该可以工作。我还没有测试过代码,但应该不会太远。

    【讨论】:

    • 是的,那应该工作。但是你不妨让它更通用,这样它就可以处理任意数量的分数,而不是硬编码为 4 个值。
    • 公平点,谢谢,可以从@idjaw 的答案中借用出色的地图并使用类似 output_dict[row[0]] = map(float, row[1:])
    • Don't use map,不过!
    • 谢谢 brianpck - 我不知道它被不赞成。我一直很喜欢一个很好的列表理解,所以会坚持使用这些。事实上,我会在我的答案中编辑一个:)。只是证明回答 q 和在 SO 上提问一样有用!
    • 噗。圭多会知道什么。 :) 说真的,当他第一次写那篇文章时,我同意 Guido 的逻辑,并且通常更喜欢列表组合或生成器表达式。但有时使用mapfilter 很方便且简洁。我的经验法则是,如果它需要 lambda,那么使用 map / filter 比等效的列表 comp / gen exp 可读性更少
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多