【问题标题】:Creating a dictionary from csv从 csv 创建字典
【发布时间】:2014-12-31 15:47:57
【问题描述】:

我是这方面的新手,并且已经阅读了很多文章,但无法弄清楚这一点。我正在尝试从此 tsv 文件创建字典:

fname   lname   marks
Alice   Brown   8.5
Francine    Walters 9
Robert  Wilson  7
Evelyn  Stewart 10
Margo   Kazinsky    9.5
Gordon  Rogers  8.5
Stephanie   Hoover  9
Roger   Brosnan 8.7
Francine    Williamson  9
Leonard Runka   8
Rosalind    Samuelson   6.5
Sasha   Levchenko   8
Anastasia   Melnyk  8.5
Charlie Watson  8

我不知道如何将它们制成字典并返回成绩最高的学生的姓名。这是我迄今为止尝试过的:

import csv

f = open('grades.tsv')
grades= []
csv_f = csv.reader(f, delimiter = ',')
for line in csv_f:
    print(line[0])
    grades.append(line[0])

f.close()

print(sorted(grades[2]))
print(len(grades))
print(grades)
print(type(line[0]))
print(grades.strip('\t'))

【问题讨论】:

  • 好吧,对于初学者来说,您没有任何涉及 dicts 的步骤。也许……试试看。
  • 查看csv 模块中的csv.DictReader,如果它的 tsv,您的分隔符可能是“\t”。
  • 参数delimiter = ',' 错误——你的值用制表符分隔。

标签: python csv dictionary


【解决方案1】:

对于它的价值,我认为使用csv.DictReader会更容易一些:

import csv

grades = {}
with open('grades.tsv', newline='') as csv_f:
    for row in csv.DictReader(csv_f, delimiter='\t'):
        fullname = row['fname'] + ' ' + row['lname']
        grades[fullname] = float(row['marks'])

print(grades)

输出:

{'Sasha Levchenko': 8.0, 'Charlie Watson': 8.0, 'Marie Curie': 10.0,
 'Margo Kazinsky': 9.5, 'Alice Brown': 8.5, 'Stephanie Hoover': 9.0,
 'Rosalind Samuelson': 6.5, 'Gordon Rogers': 8.5, 'Anastasia Melnyk': 8.5,
 'Evelyn Stewart': 10.0, 'Francine Walters': 9.0, 'Leonard Runka': 8.0,
 'Robert Wilson': 7.0, 'Roger Brosnan': 8.7, 'Francine Williamson': 9.0}

找到成绩最高的学生有点棘手,因为如果打成平手,可能会有多个学生。这是如何处理的(注意:出于测试目的,我在文件中添加了另一个学生行):

Marie   Curie   10

还有以下几行代码:

highest_grade = max(grades.values())
print('highest_grade: {}'.format(highest_grade))
tie = list(grades.values()).count(highest_grade) > 1
print('student{} with highest grade:'.format('s' if tie else ''))
for student, grade in sorted(grades.items(), key=
                             lambda s: s[0].split()[::-1]): # Sort by lname
    if grade == highest_grade:
        print('  ', student)

要获得以下输出:

highest_grade: 10.0
students with highest grade:
   Marie Curie
   Evelyn Stewart

【讨论】:

    【解决方案2】:

    你想成为你想要构建的字典中的是什么?你说的不是很清楚。假设它是firstname, lastname 2-items 元组,例如:

    with open('grades.tsv') as f:
        # assuming the first row is "headers", let's skip it
        next(f)
        r = csv.reader(f, delimiter='\t')
        d = dict(((first, last), float(grade))
                 for first, last, grade in r)
    

    当然,您需要确保正确的分隔符:“tsv”似乎暗示分隔符是一个制表符,您显示的数据的外观也是如此,但您已明确将其强制为逗号 (我在此示例中使用了选项卡,但是,请确保查看文件的内容并选择正确的内容)。

    此外,根据 OP 对这个答案的评论(以及 Q 中显示的数据),文件的第一行似乎只是标题,而不是数据;所以,我添加了next(f) 来跳过它(如果文件实际上全部由实际数据组成,没有标题行,请删除它)。

    现在d 是您要查找的字典。寻找成绩最高的学生,例如:

    top_student = max(d, key=d.get)
    print(' '.join(top_student))
    

    【讨论】:

    • 我试过你的方法,但我得到:ValueError: could not convert string to float: 'marks'。 ...?
    • @liya77:您可能需要跳过文件的第一行,其中包含列/字段名称。只需在 r = csv.reader(f, delimiter='\t') 之后添加 r.next() 语句即可。
    • 对 @martineau ,感谢您发现这一点 - 编辑以记录这一事实。
    • @martineau,我试过了,它说“AttributeError:'_csv.reader'对象没有属性'next'”,但后来我输入了“next(f)”,它起作用了!不过还是谢谢
    • next(r)next(f) 一样好用——但是next 内置调用的方法的名称取决于你的Python 版本,以前是.next 但后来变成了.__next__。最好不要担心,使用next(...)内置函数。
    猜你喜欢
    • 2016-11-20
    • 2016-09-03
    • 2011-10-08
    • 2012-12-15
    • 2021-02-20
    • 2012-01-02
    • 2016-11-22
    相关资源
    最近更新 更多