はじめの前のおねがい
できれば「いいね♡」をお願いします。励みになります。
はじめに
このコードはPython3に対応したMoodleの「参加者」の 「詳細レポート」 から、小テストを実施した回数をカウントするためのものです。
このコードの目的
Moodleは低コストで課題や小テストなどが運用できるのは良いのですが、データベースが 学生さんごとに表示されることを前提としていて、なんとなくカード型データベースっぽい感じがします。学生さん1人1人を見るときにはそれで良いのですが、授業運営をする場合には小テストの最高点がどうなのか、受験回数はどうなのかといった統計値を出す必要があるわけで、基本的にはサイドバーの「評定」を使用して得点状況については一覧性のあるデータを抽出できるわけですが、正直言って小テストが多ければ多いほど、学生さんが増えれば増えるほどスクロールも増え、どうも統計値を出すのにExcel(あるいはNumbers)の方が使い勝手が良くなります。
その場合、何度受験しても構わないし、その中で最高点を評価として使用するというある意味アメリカ型(?)の方式をとる場合、学生さんによっては百何回、何百回と小テストを実施する人が出てきます。
とりわけ語学教育の場合を考えると、高得点を1回取ったとしても、放却曲線を考慮に入れた場合、小テストの実施回数は非常に重要な要素となります。そのため、小テストの実施回数そのものも科目担当教員にとって、計算値に組み込みたいというケースが出てくるかと思われます。
このコードはExcelやその他、表計算ソフトやデータベースソフトにコピペできるように、小テストを実施した回数を文字列としてクリップボードにコピーするものです。
本コードを実行するとどうなるか
本コードを実行すると
- クリップボード内に入っている文字情報を読み取る
- その文字のうち「受験」から始まる文字列を検知してカウント
- 除外条件で指定された文字列のカウントをスキップ
- バグフィックスなどのため検知状況を表示
- 結果を表示
- クリップボードに結果の数値のみを文字列形式でコピー
となります。つまり、その結果をExcelなどにペーストできるようになっています。
こちら側で行う作業
実行前
コードを実行する前に、下記の準備をしておきましょう。
- 実行結果をペーストするための表(e.g. Excelの学生管理のファイルなど)
- Moodleの「参加者」から「詳細レポート」のページを出しておく(複数名分をあらかじめ新しいタブ(またはウィンドウ)に表示しておくと便利です)
- ページを出したら「すべてを選択」→「コピー」しておく({control} + {A} → {control} + {C})
実行後
コードを実行した後で、その実行結果をペーストするための表(e.g. Excelの学生管理のファイルなど)にペーストします。
必要なモジュール
必要なモジュールはPyperClipです。
pip install pyperclip
ソースコード
import pyperclip
def count_exam_lines():
try:
# 除外条件の文字列をここで指定
# 最初の' 0/'は「100/」や「10/」などがカウントするのを防止するために必要
exclusion_strings = [' 0/', '進行中', '期限切れ']
# クリップボードの内容を取得
clipboard_content = pyperclip.paste()
lines = clipboard_content.split('\n') # 内容を行に分割
count = 0
# 各行が「受験」で始まり、除外条件の文字列を含まないか確認
for line in lines:
if line.startswith('受験'):
if not any(exclusion_string in line for exclusion_string in exclusion_strings):
count += 1
print(f"({count}): {line}") # カウント対象の行を出力
else:
for exclusion_string in exclusion_strings:
if exclusion_string in line:
print(f"(-): {line} ({exclusion_string}を含む)") # 除外された行を出力
break
elif line.startswith('小テスト 小テスト:'):
print(f"(T): {line}") # 「小テスト 小テスト:」で始まる行を出力
# else:
# print(f"(-): {line}") # その他の行を表示したい場合はコメントアウトを解除
return count, exclusion_strings
except pyperclip.PyperclipException as e:
# クリップボードへのアクセスに失敗した場合の処理
print(f"クリップボードへのアクセスに失敗しました: {e}")
return None, None
# クリップボードの内容から「受験」で始まる行のうち、除外条件の文字列を含まない行の数をカウントして出力
count, exclusion_strings = count_exam_lines()
if count is not None:
print() # 空行を追加
print(f"クリップボードには「受験」で始まり、除外条件の文字列を含まない行が {count} 行あります。")
print(f"除外条件の文字列: {exclusion_strings}")
# 結果をクリップボードにコピー
pyperclip.copy(str(count))
以上です。お役に立てれば幸いです。