はじめの前のおねがい
できれば「いいね♡」をお願いします。励みになります。
はじめに
授業でコメントシートを求めて、それぞれをフィードバックするために、内容が単純なExcelで管理できると非常に楽ではあります。
しかしMicrosoft FormsではなくMoodleを使用した場合には、「調査モジュール」の場合は求められる設題に制限があり、いまいち使い勝手が良くありません。また「フィードバックモジュール」である程度長文のコメントを求めた場合、自動保存機能がないために「せっかく書いたのに消えた!」という声が続出したりします。これはMicrosoft Formsでも同じことが言えます……。
そのために、「課題活動モジュール」を使用をすることになりますが、学生さんたちにファイルで提出してもらった場合は、「許可されるファイルタイプ」で求めることができるファイルの種類は選べるとはいえ、様々なWordファイルが大量に届き、単純にプレーンテキストで内容が欲しいのに、図形が入っていたりなど意図しないものが届く恐れがあります。
そのため提出タイプの項目で「オンラインテキスト」のみを受け付けるようにすれば、確かに(リッチテキストになってしまいますが)テキストファイルのみで内容を受け取ることはできますが、「すべての提出を表示する」で表示される内容は一定文字数を超えると「...」で省略されてしまい、表部分をExcelにコピペしても提出された内容がそのままExcelのセルに挿入されるわけではありません。
また、Excelだとあまり意図した通りにコピペすることもできずMacOS標準の表計算ソフトNumbersを使用した方が、Moodleで表示された内容に近いものは挿入されます。
しかし、いずれにしても「...」で省略されてしまうために、結局、ルーペアイコンから別個に表示して、それをコピペし直すか、「選択した提出をダウンロードする」で、学生さんたちの名前の入ったフォルダ内にあるHTMLファイルを取得するかのどちらかになってしまいます。
しかし人数が多くなれば多くなるほど、この作業はあまりに面倒な作業になります。1人ずつフォルダを開いてHTMLファイルを開いて、コピーしてExcelに「数値のみ」でペーストして……私なら10人を超えた時点で、めまいがしてきます。
そのため、「選択した提出をダウンロードする」でダウンロードされたフォルダの中に入っている
- フォルダ名の「assignsubmission_onlinetext」より前に来ている文字をExcelの1列目
- 各「assignsubmission_onlinetext」が含まれるフォルダ内のHTMLテキストを抽出
- 抽出したテキストをプレーンテキストに変換してExcelの2列目
に入ったExcelファイルをPythonで自動生成するコードがあれば良いと思いました。
本コードを実行するとどうなるか
本コードを実行すると
- コードと同じ場所に格納されている「MoodleSubmissions」というフォルダを検知します。
- フォルダ名の「assignsubmission_onlinetext」より前に来ている文字をExcelの1列目として出力します。
- 各「assignsubmission_onlinetext」が含まれるフォルダ内のHTMLテキストを抽出します。
- 抽出したテキストをプレーンテキストに変換してExcelの2列目に出力します。
- 生成されたファイルは「ExtractedTextsYYYYMMDD.xlsx」(YYYYMMDDは生成された年月日)としてMoodleSubmissionsフォルダ内に格納されます。
この作業が自動的に行われます。
こちら側で行う作業
このコードを実行する前に、ユーザー側でしておかなければならないのは、
- コードと同じフォルダ内に「MoodleSubmissions」というフォルダを作成しておく
- 「MoodleSubmissions」フォルダ内にダウンロードした内容の中で「assignsubmission_onlinetext」の文字が末尾にくるフォルダをコピーしておく
という手順です。
必要なモジュール
必要なモジュールはBeautifulSoup 4です。
pip install beautifulsoup4
このモジュールは最新のPythonモジュールではそのままpipでインストールできないために、行き詰まった時には拙記事「初中級者向け:MacOS用IDE“CodeRunner 4”でPython仮想環境内でコードを実行する方法」を参考にしていただければと思います。
ソースコード
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)
以上です。お役に立てれば幸いです。