====== Dropboxを利用して集めた課題と履修名簿から提出一覧を自動生成する ======
dropboxを利用して課題を集めることが多いのですが、その場合履修者との提出照合でミスが発生しがちです。このままではやばいと思い、自動照合と提出チェックが一発でできるpythonを書こうと思います。前提として
* 学生の提出課題ファイルは hogehoge - 学籍番号.拡張子(yamada taro - 0123456789.pdf等)
* それぞれの提出課題ファイルは 課題1hogehogeというdirectoryにそれぞれ保存されている
となっているものとします。
[[課題をさばく:学籍番号を含んだファイル名からcsv作成|学籍番号を含んだファイル名からCSVを作成する]]をベースにするところから始めます。まずは指定したフォルダ内から提出者の一覧学籍番号を出力することはできました。これをまずはすべての課題フォルダに対して一度で実行可能であるようにしておきますが、これは引数自体をワイルドカードで変更すればOKなので、下記のようにすることで、すべての課題フォルダに対して一覧が作成されます。
> python printList.py 課題*/*
では次にprintListを修正して、履修名簿CSVを事前に読み込み、提出された課題に対しては1をつける、という具合にします。なお、こちらで想定している完成形は下記のようなcsvをつくることです。
^ 学籍番号 ^ 課題1 ^ 課題2 ^
| 0123456789 | 1 | 1 |
| 0123456787 | 1 | 0 |
以下 ファイル構成は以下の通りとして、実行するprintList.pyはmember.csv(履修登録学籍番号が順番に一行ずつはいったもの)
└── 2019
├── kadai1
├── kadai2
├── kadai3
├── member.csv
├── printList.py
import os
import glob
import sys
import csv
args = sys.argv[1:]
def getNumberList(_files):
number_list = []
for f in _files:
name_parent_directory = os.path.basename(os.path.dirname(os.path.abspath(f)))
filename = os.path.basename(f)
ftitle, text = os.path.splitext(filename)
number_list.append([name_parent_directory, ftitle.split(' ')[3]])
return number_list
# Get all student number based on submitted files.
number_list = getNumberList(args)
number_list.sort()
# Create a kind of kadai array. How many kadai is imposed today?
kind_of_parent_directory = []
for f in args:
name_parent_directory = os.path.basename(os.path.dirname(os.path.abspath(f)))
kind_of_parent_directory.append(name_parent_directory)
# Create unique KADAI name as a list, such as kadai1, kadai2,
kind_of_parent_directory = list(set(kind_of_parent_directory))
# Prepare for all result list
score_lists = []
titles = []
titles.append("Number")
for i in range(len(kind_of_parent_directory)):
titles.append(kind_of_parent_directory[i])
score_lists.append(titles)
# Be sure to prepare all sutudents number on your class
f_csv = open('member.csv', 'r')
reader_csv = csv.reader(f_csv, delimiter=",")
# Main
for r_csv in reader_csv:
score_list = []
score_list.append(r_csv[0])
for i in range(len(kind_of_parent_directory)):
count_submitted = 0
for nl in number_list:
if int(r_csv[0]) == int(nl[1]) and kind_of_parent_directory[i] == nl[0]:
score_list.append(1)
count_submitted += 1
if count_submitted != 1:
score_list.append(0)
score_lists.append(score_list)
# print result on standart output.
for list in score_lists:
count = 0
for value in list:
if count != len(list) -1:
print str(value)+",",
else:
print str(value)
count += 1