0
2

Python3: Moodleの「参加者」の「詳細レポート」で、小テストを実施した回数をカウントする

Posted at

はじめの前のおねがい

できれば「いいね♡」をお願いします。励みになります。

はじめに

このコードはPython3に対応したMoodleの「参加者」の 「詳細レポート」 から、小テストを実施した回数をカウントするためのものです。

このコードの目的

Moodleは低コストで課題や小テストなどが運用できるのは良いのですが、データベースが 学生さんごとに表示されることを前提としていて、なんとなくカード型データベースっぽい感じがします。学生さん1人1人を見るときにはそれで良いのですが、授業運営をする場合には小テストの最高点がどうなのか、受験回数はどうなのかといった統計値を出す必要があるわけで、基本的にはサイドバーの「評定」を使用して得点状況については一覧性のあるデータを抽出できるわけですが、正直言って小テストが多ければ多いほど、学生さんが増えれば増えるほどスクロールも増え、どうも統計値を出すのにExcel(あるいはNumbers)の方が使い勝手が良くなります。

その場合、何度受験しても構わないし、その中で最高点を評価として使用するというある意味アメリカ型(?)の方式をとる場合、学生さんによっては百何回、何百回と小テストを実施する人が出てきます。

とりわけ語学教育の場合を考えると、高得点を1回取ったとしても、放却曲線を考慮に入れた場合、小テストの実施回数は非常に重要な要素となります。そのため、小テストの実施回数そのものも科目担当教員にとって、計算値に組み込みたいというケースが出てくるかと思われます。

このコードはExcelやその他、表計算ソフトやデータベースソフトにコピペできるように、小テストを実施した回数を文字列としてクリップボードにコピーするものです。

本コードを実行するとどうなるか

本コードを実行すると

  1. クリップボード内に入っている文字情報を読み取る
  2. その文字のうち「受験」から始まる文字列を検知してカウント
  3. 除外条件で指定された文字列のカウントをスキップ
  4. バグフィックスなどのため検知状況を表示
  5. 結果を表示
  6. クリップボードに結果の数値のみを文字列形式でコピー

となります。つまり、その結果をExcelなどにペーストできるようになっています。

こちら側で行う作業

実行前

コードを実行する前に、下記の準備をしておきましょう。

  1. 実行結果をペーストするための表(e.g. Excelの学生管理のファイルなど)
  2. Moodleの「参加者」から「詳細レポート」のページを出しておく(複数名分をあらかじめ新しいタブ(またはウィンドウ)に表示しておくと便利です)
  3. ページを出したら「すべてを選択」→「コピー」しておく({control} + {A} → {control} + {C})

実行後

コードを実行した後で、その実行結果をペーストするための表(e.g. Excelの学生管理のファイルなど)にペーストします。

必要なモジュール

必要なモジュールはPyperClipです。

pip install pyperclip

ソースコード

Count_Quizes.py
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))

以上です。お役に立てれば幸いです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2