Python依旧按字典顺序写入文件

时间:2016-11-23 02:49:10

标签: python python-3.x

我对下面这个问题有疑问;我的输出应如下所示。

输出:

ID    Exam1    Exam2    Homework    Attendance    Project1    Project2    Class Recap    Final Grade    Potential Grade
32165487    10    70    50    40    100    80    50    100    D
21321853    52    95    72    56    95    32    56    100    C+
41861235    95    12    47    32    68    92    35    100    D
84534853    58    38    84    84    89    68    74    100    C

代码:

def generateReport(gradebook):
    outfile=open('gradebook.txt','w')
    currentstud=[]

    for stu in d:
        #print(stu)
        currentstud.append(d[stu])
        whatever={}
        lst1=[]
    for students in currentstud:
        print(students)
        grades1=[]
    for grades in students:  
        outfile.write(grades + '\t')
    outfile.write('\n')
    for val in students.values():

        outfile.write(val + '\t') 
    outfile.close



    d={'37340752': {'exam1': '50', 'project1': '40', 'classrecap': '39', 'homework': '62', 'exam2': '3', 'attendance': '17', 'project2': '86', 'id': '37340752'},
       '95255664': {'exam1': '76', 'project1': '60', 'classrecap': '39', 'homework': '81', 'exam2': '57', 'attendance': '19', 'project2': '42', 'id': '95255664'},
       '47718233': {'exam1': '81', 'project1': '55', 'classrecap': '53', 'homework': '46', 'exam2': '46', 'attendance': '4', 'project2': '14', 'id': '47718233'},
       '55527760': {'exam1': '34', 'project1': '89', 'classrecap': '39', 'homework': '19', 'exam2': '99', 'attendance': '78', 'pta': 65, 'project2': '99', 'id': '55527760'},
       '32548926': {'exam1': '9', 'project1': '7', 'classrecap': '77', 'homework': '98', 'exam2': '1', 'attendance': '43', 'project2': '86', 'id': '32548926'}}

    print(generateReport(d))

这是我获得的上述代码的输出。如何让它打印所有行而不是只打印一行?

project1    homework    attendance  id  exam2   exam1   project2    classrecap  
55  46  4   47718233    46  81  14  53

2 个答案:

答案 0 :(得分:3)

为所有学生提供成绩(成绩循环应该在学生中)

def generateReport(gradebook):
    outfile=open('gradebook.txt','w')
    currentstud=[]
    for stu in d:
        currentstud.append(d[stu])
    for grades in currentstud[0]:
        outfile.write(grades + '\t')
    outfile.write('\n') 
    for students in currentstud:
        for val in students.values():
            outfile.write(str(val) + '\t')
        outfile.write('\n')
    outfile.close



d={'37340752': {'exam1': '50', 'project1': '40', 'classrecap': '39', 'homework': '62', 'exam2': '3', 'attendance': '17', 'project2': '86', 'id': '37340752'},
       '95255664': {'exam1': '76', 'project1': '60', 'classrecap': '39', 'homework': '81', 'exam2': '57', 'attendance': '19', 'project2': '42', 'id': '95255664'},
       '47718233': {'exam1': '81', 'project1': '55', 'classrecap': '53', 'homework': '46', 'exam2': '46', 'attendance': '4', 'project2': '14', 'id': '47718233'},
       '55527760': {'exam1': '34', 'project1': '89', 'classrecap': '39', 'homework': '19', 'exam2': '99', 'attendance': '78', 'pta': 65, 'project2': '99', 'id': '55527760'},
       '32548926': {'exam1': '9', 'project1': '7', 'classrecap': '77', 'homework': '98', 'exam2': '1', 'attendance': '43', 'project2': '86', 'id': '32548926'}}

print(generateReport(d))

答案 1 :(得分:0)

真的?我得到的输出是:

> TypeError: unsupported operand type(s) for +: 'int' and 'str'

将您的代码放入repl.it,它会向您显示许多警告中的问题:

screenshot of this code in repl.it editor, highlighting the problem

您写入文件的唯一位置是第14行和第17行,它们位于循环for grades in students:for val in students.values()中,但您尚未在任何位置定义students

你确实在之前的循环中使用它作为循环变量,因此students具有前一循环的结束值。

要修复它,您需要在成绩簿上循环一次以一次获得一个学生,然后对于每个条目,您需要循环学生的数据以处理该文件的行。

关于'按顺序'你的头衔是什么?目前尚不清楚您是否应该订购列,行或两者,或订单是什么。但是当你使用一个有序的数据结构(一个元组,一个列表)时,你会使用一个无序的数据结构(一个字典),这会让你的生活变得更加容易。

(那么你想要的输出中哪些列不存在于你的数据中,比如潜在等级?或者你想要的标题与你的数据的大写/间距不同的方式,而Python是区分大小写的,所以这很烦人?或者csv模块的存在方式可以为你做很多工作。)

  1. 您将数据传递到名为generateReport的{​​{1}} - 使用该名称。当你使用gradebook进入函数时,进入父范围,这是纠结和棘手的,这意味着d永远不会被使用,这对于阅读它的任何人来说都是令人困惑和无益的。

  2. 使用有用的名称 - gradebook来迭代学生ID,而不是student_idstu单数用于单一事物,而不是student。不是students

  3. 并使用whatever关闭outfile以调用close方法。

  4. 并且不打印generateReport()的输出...因为没有返回输出来打印。

  5. 解决所有这些问题让我看到了这一点:列作为示例输出排序和装入,输入仍作为示例输入,学生行按ID排序。

    ()

    你可以run online at repl.it,然后有一个使用CSV模块的版本,注释掉。

    • 我与repl.it没有任何关系,我非常喜欢它。