Quick and dirty proof of concept.
grade.py:
Code
import glob, os, re
def load_file(filename, re_pattern):
student_dict = {}
with open(filename) as grade_file:
raw_data = grade_file.read().split('\n\n')
for i, raw_section in enumerate(raw_data):
if re_pattern.findall(raw_section):
student_dict['section' + str(i+1)]=re_pattern.findall(raw_section)
return student_dict
def get_student_list(path, keyfile_name):
student_list = glob.glob('./*.txt')
return [student for student in student_list if student != keyfile_name]
def grade_test(student_name, answer_key, re_pattern):
total_earned_points = total_possible_points = 0
student_answers = load_file(student_name, re_pattern)
print os.path.basename(student_name).split('.')[0], '\n'
for section_name in answer_key:
section_analysis, num_correct_answers = [], 0
for i, answer in enumerate(answer_key[section_name]):
if answer == student_answers[section_name][i]:
num_correct_answers += 1
else:
section_analysis.append(('#%d: You marked: %s. Correct Answer: %s') % \
(i+1, student_answers[section_name][i], answer))
total_earned_points += num_correct_answers
total_possible_points += i + 1
print section_name + ':'
print 'Score', num_correct_answers, '/', i + 1
print 'Percentage:', num_correct_answers * 100.0 / (i+1), '%'
for entry in section_analysis:
print entry
print ''
print "Overall\nNumber of Sections:", len(answer_key),
print 'Total Score:', total_earned_points, '/', total_possible_points
print '---------------------------------'
keyfile_name = './Key.txt'
re_pattern = re.compile(r'\d. (\w)')
answer_key = load_file(keyfile_name, re_pattern)
student_list = get_student_list('./*.txt', keyfile_name)
print '---------------------------------'
for student in student_list:
grade_test(student, answer_key, re_pattern)