【问题标题】:How to iterate over data from a file?如何遍历文件中的数据?
【发布时间】:2015-07-13 05:59:53
【问题描述】:

我是 Python 新手,我正在尝试弄清楚如何从源文件中显示不同的内容。任务是编写一个程序,让用户输入包含数学课测试答案(A、B、C 或 D)的文件的名称,然后打开该文件,我相信我已经在下面完成了。每个文件的行数不同,因为每个班级有不同数量的学生。每行包含一个学生的 ID 号和他们为测试提供的答案,以逗号分隔。示例:

"N12345678,B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D"

然后程序应该通过比较每个学生的答案与答案键来“评分”测试,即

"B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D"

程序还应确定并打印出文本文件中所有学生的最高分、最低分以及分数的平均值、中位数、众数和范围。

我已经编写了用于打开文件并计算学生人数的部分,但我一直在尝试编写对每个学生的答案进行评分的部分,但未能成功。这是我到目前为止所拥有的:

file_name = input("Enter a class file to grade (class1.txt, class2.txt, etc): ")
try:
    outfile = open(file_name, 'r')
    print("Successfuly opened",file_name)
    print()
except:
    print("File does not exist.")

student_counter = 0
for line in outfile:
    data = (line.rstrip('\n'))
    print(data)
    student_counter = student_counter + 1

print(student_counter)

以下是我尝试为每个学生的答案评分的方法,但它似乎不起作用。每答对一题得4分,每答错一题扣1分,每题留空计0分。:

answers = ["B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D"]
total = 1
counter = 1

for line in outfile:
    student_counter = student_counter + 1
    text_line = line.split(',')
    if (text_line[counter] == answers[counter-1]):
        total = total+4
    elif text_line[counter] == ' ':
        total = total
        counter = counter +1
    else:
        total = total-1
print(total)

如何编辑我的程序以遍历输入文件中的每一行并显示最高分、最低分、中位数、众数和范围?

【问题讨论】:

    标签: python file loops iteration


    【解决方案1】:

    在这种情况下,Python 的 split(delimiter) 是你的朋友。一种可能的解决方案是遍历文件中的行,将它们拆分并将它们与键进行比较。 zip 函数派上用场:如果您还拆分密钥,您将得到两个相同长度的列表,其中一个列表包含学生的答案,第二个包含正确答案。

    zip 从这两个列表中创建一个元组列表,其中每个元组包含学生的答案和正确答案,您可以简单地比较这两者。

    为了做一些未来的计算,简单的方法是将结果保存到一些外部结构,然后进行计算。执行此操作的代码如下所示:

    key = 'B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D'.split(',')
    students = {}
    
    with open('grades', 'r') as f:
        for line in f:
            line_split = line.rstrip('\n').split(',')
            students[line_split[0]] = 0
            for key, answer in zip(key, line_split[1:]):
                if key == answer:
                    students[line_split[0]] = students[line_split[0]] + 4
                else:
                    students[line_split[0]] = students[line_split[0]] - 1
    
    print students
    

    给出输出

    {'N12345678': 100}

    为您的示例数据。

    如果您要迭代结果并进行一些计算,您可以这样做

    for student, score in students:
        print score
    

    但我会把计算留给你,这样你就可以自己解决作业了。

    【讨论】:

      【解决方案2】:

      如果您可以使用字典,我建议您选择以下代码:

      answers = ['B', 'A', 'D', 'D', 'C', 'B', 'D', 'A', 'C', 'C', 'D', 'B', 'A', 'B', 'A', 'C', 'B', 'D', 'A', 'C', 'A', 'A', 'B', 'D', 'D']
      students = {}
      
      # Example of a line from the outfile
      outfile = ["N12345678,B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D"]
      
      # This simulates the loop used to iterate over the textfile
      for line in outfile:
          total = 0  # Total score for the student
      
          student_answers = line.split(',')  # The student and his answers
      
          # We enumerate each element of the student's answer sheet. We exclude his ID for obvious reasons
          for i, answer in enumerate(student_answers[1:]):
              if (answer == answers[i]):  #Correct answer
                  total += 4
              elif text_line[counter] != answers[i]:  # Wrong answer
                  total -= 1
              else:  # Blank answer, we pass to the next iteration
                  pass
      
          # We finally asociate each student's ID to his score.
          students[student_answers[0]] = total
      
      print(students)
      

      【讨论】:

        猜你喜欢
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 2021-08-20
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2021-07-01
        相关资源
        最近更新 更多