0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python3: Moodle「課題活動モジュール」で「オンラインテキスト」を選び回収したテキストをExcel化

Last updated at Posted at 2024-05-04

はじめの前のおねがい

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

はじめに

授業でコメントシートを求めて、それぞれをフィードバックするために、内容が単純なExcelで管理できると非常に楽ではあります。

しかしMicrosoft FormsではなくMoodleを使用した場合には、「調査モジュール」の場合は求められる設題に制限があり、いまいち使い勝手が良くありません。また「フィードバックモジュール」である程度長文のコメントを求めた場合、自動保存機能がないために「せっかく書いたのに消えた!」という声が続出したりします。これはMicrosoft Formsでも同じことが言えます……。

そのために、「課題活動モジュール」を使用をすることになりますが、学生さんたちにファイルで提出してもらった場合は、「許可されるファイルタイプ」で求めることができるファイルの種類は選べるとはいえ、様々なWordファイルが大量に届き、単純にプレーンテキストで内容が欲しいのに、図形が入っていたりなど意図しないものが届く恐れがあります。

そのため提出タイプの項目で「オンラインテキスト」のみを受け付けるようにすれば、確かに(リッチテキストになってしまいますが)テキストファイルのみで内容を受け取ることはできますが、「すべての提出を表示する」で表示される内容は一定文字数を超えると「...」で省略されてしまい、表部分をExcelにコピペしても提出された内容がそのままExcelのセルに挿入されるわけではありません。

また、Excelだとあまり意図した通りにコピペすることもできずMacOS標準の表計算ソフトNumbersを使用した方が、Moodleで表示された内容に近いものは挿入されます。

しかし、いずれにしても「...」で省略されてしまうために、結局、ルーペアイコンから別個に表示して、それをコピペし直すか、「選択した提出をダウンロードする」で、学生さんたちの名前の入ったフォルダ内にあるHTMLファイルを取得するかのどちらかになってしまいます。

しかし人数が多くなれば多くなるほど、この作業はあまりに面倒な作業になります。1人ずつフォルダを開いてHTMLファイルを開いて、コピーしてExcelに「数値のみ」でペーストして……私なら10人を超えた時点で、めまいがしてきます。

そのため、「選択した提出をダウンロードする」でダウンロードされたフォルダの中に入っている

  1. フォルダ名の「assignsubmission_onlinetext」より前に来ている文字をExcelの1列目
  2. 各「assignsubmission_onlinetext」が含まれるフォルダ内のHTMLテキストを抽出
  3. 抽出したテキストをプレーンテキストに変換してExcelの2列目

に入ったExcelファイルをPythonで自動生成するコードがあれば良いと思いました。

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

本コードを実行すると

  1. コードと同じ場所に格納されている「MoodleSubmissions」というフォルダを検知します。
  2. フォルダ名の「assignsubmission_onlinetext」より前に来ている文字をExcelの1列目として出力します。
  3. 各「assignsubmission_onlinetext」が含まれるフォルダ内のHTMLテキストを抽出します。
  4. 抽出したテキストをプレーンテキストに変換してExcelの2列目に出力します。
  5. 生成されたファイルは「ExtractedTextsYYYYMMDD.xlsx」(YYYYMMDDは生成された年月日)としてMoodleSubmissionsフォルダ内に格納されます。

この作業が自動的に行われます。

こちら側で行う作業

このコードを実行する前に、ユーザー側でしておかなければならないのは、

  1. コードと同じフォルダ内に「MoodleSubmissions」というフォルダを作成しておく
  2. 「MoodleSubmissions」フォルダ内にダウンロードした内容の中で「assignsubmission_onlinetext」の文字が末尾にくるフォルダをコピーしておく

という手順です。

必要なモジュール

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

pip install beautifulsoup4

このモジュールは最新のPythonモジュールではそのままpipでインストールできないために、行き詰まった時には拙記事「初中級者向け:MacOS用IDE“CodeRunner 4”でPython仮想環境内でコードを実行する方法」を参考にしていただければと思います。

ソースコード

Moodle2Excel.py
import os
import pandas as pd
from bs4 import BeautifulSoup
from datetime import datetime

# 現在のディレクトリにある 'MoodleSubmissions' フォルダのパスを設定
current_directory = os.getcwd()
folder_path = os.path.join(current_directory, 'MoodleSubmissions')

# ディレクトリが存在しない場合は作成
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

# 結果を格納するためのリスト
data = []

# 指定フォルダ内のフォルダを検索
for root, dirs, files in os.walk(folder_path):
    if '_assignsubmission_onlinetext_' in root:
        student_id = root.split(os.sep)[-1].split('_assignsubmission_onlinetext_')[0]
        # onlinetext.html ファイルを検出
        for file in files:
            if file == 'onlinetext.html':
                file_path = os.path.join(root, file)
                # HTML ファイルを開いて内容を抽出
                with open(file_path, 'r', encoding='utf-8') as f:
                    soup = BeautifulSoup(f.read(), 'html.parser')
                    # プレーンテキストを抽出
                    text = soup.get_text(strip=True)
                    # 学生IDとテキストをリストに追加
                    data.append([student_id, text])

# データを変換
df = pd.DataFrame(data, columns=['Student ID', 'Text'])

# 現在の日付を取得してファイル名に追加
date_string = datetime.now().strftime('_%Y%m%d')

# Excelファイルとして保存
output_path = os.path.join(folder_path, f'ExtractedTexts{date_string}.xlsx')
df.to_excel(output_path, index=False)

print("Excelファイル:", output_path)

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

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?