Python 使用.format()获得完美的输出

Python 使用.format()获得完美的输出,python,file,file-io,Python,File,File Io,编写一个名为print_grades的函数,该函数接受文件名(字符串)作为输入参数。您的函数应该调用函数来读取文件并创建等级字典。使用成绩字典,你的函数应该以如下所示的精确格式打印学生的姓名、成绩和平均成绩。请注意,要求您编写一个函数(不是程序),该函数将打印成绩。打印成绩后,函数应返回None 示例输入文件: 1000123456,Rubble,Test_3,80,Test_4,80,quiz,90 1000123210,Bunny,Test_2,100,Test_1,100,Test_3,1

编写一个名为print_grades的函数,该函数接受文件名(字符串)作为输入参数。您的函数应该调用函数来读取文件并创建等级字典。使用成绩字典,你的函数应该以如下所示的精确格式打印学生的姓名、成绩和平均成绩。请注意,要求您编写一个函数(不是程序),该函数将打印成绩。打印成绩后,函数应返回None

示例输入文件:

1000123456,Rubble,Test_3,80,Test_4,80,quiz,90
1000123210,Bunny,Test_2,100,Test_1,100,Test_3,100,Test_4,100
1000123458,Duck,Test_1,86,Test_5,100,Test_2,93,Test_4,94
程序的输出应为:

    ID     |       Name       | Test_1 | Test_2 | Test_3 | Test_4 |  Avg.  |
1000123210 | Bunny            |    100 |    100 |    100 |    100 | 100.00 |
1000123456 | Rubble           |      0 |      0 |     80 |     80 |  40.00 | 
1000123458 | Duck             |     86 |     93 |      0 |     94 |  68.25 |
注:

  • 列标题都居中

  • 打印输出根据学生ID按升序排序

  • 每列与相邻列之间用三个字符“|”分隔(空格垂直|空格)
  • ID始终为10个字符,并左对齐(不包括边界字符)
  • 名称左对齐(最多16个字符,不包括边界字符)
  • 分数和平均数是正确的。等级和平均值列的宽度为6个字符(不包括边界字符)
  • 平均值以小数点后两位精度右对齐
迄今为止开发的代码。请告诉我下一步该做什么

代码:


您应该记住以下几点:

  • 您的输入行可能包含垃圾数据—您需要忽略的数据
  • 您的输入文件可能有空行,您需要对其进行测试
  • 解包变量需要在
    =
    符号的左侧和右侧之间保持平衡;如果右边的东西太多,左边的变量太少,您将得到:

    >>> a,b,c = 1,2,3,4
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: too many values to unpack
    
    >a,b,c=1,2,3,4
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    ValueError:要解压缩的值太多
    
    当然,如果左侧的变量太多,则会出现不同的错误:

    >>> a,b,c = 1,2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: need more than 2 values to unpack
    
    >a,b,c=1,2
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    ValueError:需要2个以上的值才能解包
    

    试着读整行,并按
    进行拆分(正如您现在所做的)。然后,逐行查看返回的列表,然后分离您的值,而不是假设所有行都按正确的顺序包含正确的信息。

    您应该记住以下几点:

  • 您的输入行可能包含垃圾数据—您需要忽略的数据
  • 您的输入文件可能有空行,您需要对其进行测试
  • 解包变量需要在
    =
    符号的左侧和右侧之间保持平衡;如果右边的东西太多,左边的变量太少,您将得到:

    >>> a,b,c = 1,2,3,4
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: too many values to unpack
    
    >a,b,c=1,2,3,4
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    ValueError:要解压缩的值太多
    
    当然,如果左侧的变量太多,则会出现不同的错误:

    >>> a,b,c = 1,2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: need more than 2 values to unpack
    
    >a,b,c=1,2
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    ValueError:需要2个以上的值才能解包
    

    试着读整行,并按
    进行拆分(正如您现在所做的)。然后,一步一步地浏览返回的列表,然后分离您的值,而不是假设所有行都以正确的顺序包含正确的信息。

    正如Burhan向您解释的错误。你可以这样做:

    a = "1000123456,Rubble,Test_3,80,Test_4,80,quiz,90"
    >>> my_val = a.split(",")
    >>> my_val
    ['1000123456', 'Rubble', 'Test_3', '80', 'Test_4', '80', 'quiz', '90']
    >>> id,name = my_val[0], my_val[1]
    >>> id
    '1000123456'
    >>> name
    'Rubble'
    my_dict = dict(zip(my_val[2::2],my_val[3::2]))
    >>> my_dict
    {'Test_4': '80', 'Test_3': '80', 'quiz': '90'}
    
    现在您可以使用
    dict.get(key[,default])


    正如伯翰向你解释的那样。你可以这样做:

    a = "1000123456,Rubble,Test_3,80,Test_4,80,quiz,90"
    >>> my_val = a.split(",")
    >>> my_val
    ['1000123456', 'Rubble', 'Test_3', '80', 'Test_4', '80', 'quiz', '90']
    >>> id,name = my_val[0], my_val[1]
    >>> id
    '1000123456'
    >>> name
    'Rubble'
    my_dict = dict(zip(my_val[2::2],my_val[3::2]))
    >>> my_dict
    {'Test_4': '80', 'Test_3': '80', 'quiz': '90'}
    
    现在您可以使用
    dict.get(key[,default])


    要获得预期效果,需要两个函数:

    第一个功能:

    def create_grades_dict(file_name):
        my_dictionary = {}
        file_pointer = open(file_name, 'r')
        data = file_pointer.readlines()
        for line in data:
            student_row = map(str.strip, line.strip().split(','))
            student_id = student_row.pop(0)
            student_lastname = student_row.pop(0)
            student_data = [student_lastname]
            for valid_test in ['Test_1', 'Test_2', 'Test_3', 'Test_4']:
                if valid_test in student_row:
                    student_data.append(int(student_row[student_row.index(valid_test) + 1]))
                else:
                    student_data.append(0)
            student_data.append(sum(student_data[-4: ])/4)        
            my_dictionary[student_id] = student_data
        return my_dictionary
    
    def print_grades(file_name):
        # Call your create_grades_dict() function to create the dictionary
        grades_dict=create_grades_dict(file_name)
        print ("    ID     |       Name       | Test_1 | Test_2 | Test_3 | Test_4 |  Avg.  |")
        for key in sorted(grades_dict.keys()):
            print ("{0:<10} | {1:<16} | {2:>6} | {3:>6} | {4:>6} | {5:>6} | {6:>6.2f} |".format(key, grades_dict[key][0],  grades_dict[key][1],  grades_dict[key][2], grades_dict[key][3], grades_dict[key][4], grades_dict[key][5], ))
    
    第二功能:

    def create_grades_dict(file_name):
        my_dictionary = {}
        file_pointer = open(file_name, 'r')
        data = file_pointer.readlines()
        for line in data:
            student_row = map(str.strip, line.strip().split(','))
            student_id = student_row.pop(0)
            student_lastname = student_row.pop(0)
            student_data = [student_lastname]
            for valid_test in ['Test_1', 'Test_2', 'Test_3', 'Test_4']:
                if valid_test in student_row:
                    student_data.append(int(student_row[student_row.index(valid_test) + 1]))
                else:
                    student_data.append(0)
            student_data.append(sum(student_data[-4: ])/4)        
            my_dictionary[student_id] = student_data
        return my_dictionary
    
    def print_grades(file_name):
        # Call your create_grades_dict() function to create the dictionary
        grades_dict=create_grades_dict(file_name)
        print ("    ID     |       Name       | Test_1 | Test_2 | Test_3 | Test_4 |  Avg.  |")
        for key in sorted(grades_dict.keys()):
            print ("{0:<10} | {1:<16} | {2:>6} | {3:>6} | {4:>6} | {5:>6} | {6:>6.2f} |".format(key, grades_dict[key][0],  grades_dict[key][1],  grades_dict[key][2], grades_dict[key][3], grades_dict[key][4], grades_dict[key][5], ))
    

    要获得预期效果,需要两个函数:

    第一个功能:

    def create_grades_dict(file_name):
        my_dictionary = {}
        file_pointer = open(file_name, 'r')
        data = file_pointer.readlines()
        for line in data:
            student_row = map(str.strip, line.strip().split(','))
            student_id = student_row.pop(0)
            student_lastname = student_row.pop(0)
            student_data = [student_lastname]
            for valid_test in ['Test_1', 'Test_2', 'Test_3', 'Test_4']:
                if valid_test in student_row:
                    student_data.append(int(student_row[student_row.index(valid_test) + 1]))
                else:
                    student_data.append(0)
            student_data.append(sum(student_data[-4: ])/4)        
            my_dictionary[student_id] = student_data
        return my_dictionary
    
    def print_grades(file_name):
        # Call your create_grades_dict() function to create the dictionary
        grades_dict=create_grades_dict(file_name)
        print ("    ID     |       Name       | Test_1 | Test_2 | Test_3 | Test_4 |  Avg.  |")
        for key in sorted(grades_dict.keys()):
            print ("{0:<10} | {1:<16} | {2:>6} | {3:>6} | {4:>6} | {5:>6} | {6:>6.2f} |".format(key, grades_dict[key][0],  grades_dict[key][1],  grades_dict[key][2], grades_dict[key][3], grades_dict[key][4], grades_dict[key][5], ))
    
    第二功能:

    def create_grades_dict(file_name):
        my_dictionary = {}
        file_pointer = open(file_name, 'r')
        data = file_pointer.readlines()
        for line in data:
            student_row = map(str.strip, line.strip().split(','))
            student_id = student_row.pop(0)
            student_lastname = student_row.pop(0)
            student_data = [student_lastname]
            for valid_test in ['Test_1', 'Test_2', 'Test_3', 'Test_4']:
                if valid_test in student_row:
                    student_data.append(int(student_row[student_row.index(valid_test) + 1]))
                else:
                    student_data.append(0)
            student_data.append(sum(student_data[-4: ])/4)        
            my_dictionary[student_id] = student_data
        return my_dictionary
    
    def print_grades(file_name):
        # Call your create_grades_dict() function to create the dictionary
        grades_dict=create_grades_dict(file_name)
        print ("    ID     |       Name       | Test_1 | Test_2 | Test_3 | Test_4 |  Avg.  |")
        for key in sorted(grades_dict.keys()):
            print ("{0:<10} | {1:<16} | {2:>6} | {3:>6} | {4:>6} | {5:>6} | {6:>6.2f} |".format(key, grades_dict[key][0],  grades_dict[key][1],  grades_dict[key][2], grades_dict[key][3], grades_dict[key][4], grades_dict[key][5], ))
    

    您仅为具有八个值的行指定了六个名称。您尝试将八个值拆分为六个变量您仅为具有八个值的行指定了六个名称。您尝试将八个值拆分为六个变量