CoderCastrov logo
CoderCastrov
Питон

Автоматизация скучных задач с помощью Python - Автоматическая запись сдачи заданий

Автоматизация скучных задач с помощью Python - Автоматическая запись сдачи заданий
просмотров
6 мин чтение
#Питон

После моей первой статьи некоторое время назад о Автоматическом сканере присутствия, возвращаюсь к серии "Автоматизация скучных задач с помощью Python". В этот раз я хочу поделиться опытом создания небольшого скрипта на Python для автоматической записи сдачи заданий на тренинге.

Эта статья написана с желанием поделиться и показать административным сотрудникам, какие задачи могут быть очень простыми, если их автоматизировать с помощью программирования. Если бы большинство офисных сотрудников владели навыками программирования, то, как быстро работала бы государственная бюрократия!


Введение

Предположим, что есть тренинг с участием около 1 500 человек. К счастью, в то время я стажировал в организации этого тренинга.

На тренинге было 6 обязательных предметов, которые должны были пройти все участники. В течение тренинга также иногда были задания, которые должны были выполнить все участники. Организаторы предоставили веб-платформу электронного обучения, которую участники могли использовать для сдачи своих заданий.

По окончании тренинга меня попросили заняться учетом сдачи задания 1 500 участников. Мои коллеги дали мне шаблон матрицы со списком 1 500 участников и 6 предметов тренинга в формате Excel, как показано на рисунке 1.

Gambar 1. Daftar rekap pengumpulan penugasan yang masih kosong

Для выполнения учета мне нужно было войти на веб-платформу электронного обучения в качестве администратора, чтобы получить список сдачи заданий по каждому предмету. На этой странице есть несколько данных, таких как: общая запись о сдаче всех участников, время сдачи и список приложений, которые были прикреплены. Пример страницы администратора показан на рисунке 2.

Затем, вручную, мне нужно было проверить статус участника А в сдаче его задания, найдя имя участника А с помощью комбинации клавиш ctrl + F.

На основе результатов поиска (см. рисунок 2) существуют три возможных варианта статуса сдачи задания для каждого человека:

  • Сдано (V): Если имя участника А найдено, и участник А приложил хотя бы одно приложение
  • Пропущено (X): Если имя участника А найдено, но участник А не предоставил никаких приложений (предположительно, из-за небрежности участника А, который отправил задание без прикрепления)
  • Не сдано (-): Если имя участника А не найдено в результате поиска
Gambar 2. Contoh halaman rekap pengumpulan pada mata pelajaran Analisis Kasus

Предположим, что каждый предмет имеет только одно задание, то есть мне нужно проверить 1 500 человек x 6 предметов, и мне нужно вручную вводить их имена, чтобы определить статус сдачи задания.

Поскольку это выглядит очень утомительно, обычно такую работу дается на выполнение 2-3 человекам сроком в одну неделю. Честно говоря, я действительно попытался выполнить эту задачу вручную, и когда я достиг имени около 40-го человека, я сдался :")

Насколько мне известно, этот отчет затем будет использоваться отделом оценки в качестве основы для дальнейшей корректировки или для последующего контакта с участниками, которые не предоставили задание. Поэтому, на мой взгляд, важно найти быстрый способ выполнить этот учет сдачи задания.

Как человек с небольшим опытом в программировании, я считаю, что задачи с ясным шаблоном и не слишком сложные для принятия решений (которые мы называем "утомительными" задачами) должны быть доверены компьютеру, который, если правильно настроен, может стать моим личным рабом, который работает супер быстро и никогда не делает ошибок.

Примечание: Возможно, веб-платформа электронного обучения не предоставляет функцию отчета, или, возможно, я не слишком внимательно искал эту функцию. Информация: электронное обучение было создано с использованием платного шаблона Wordpress. Сдача заданий рассматривается как экземпляр комментария, поэтому до сих пор я не нашел функцию, которая позволяет узнать, какие участники не предоставили задание.

Планирование

Как обычно, мы сначала определяем проблему и ее ограничения, прежде чем перейти к следующему шагу.

Во-первых, я проанализировал HTML-код административной страницы (рисунок 2), который я получил просто с помощью функции "Сохранить как HTML" в браузере. Вот пример упрощенного HTML-кода двух участников, которые сдали по два PDF-файла в качестве вложений:

<tr id="coomment-xxxx" class="comment byuser comment-author-xxxx …">
    <div class="author">Имя участника</div>
    <div class="attachmentFile">Вложение 1</div>
    <div class="attachmentFile">Вложение 2</div>
</tr>
<tr id="coomment-yyyy" class="comment byuser comment-author-yyyy …">
    <div class="author">Имя участника</div>
    <div class="attachmentFile">Вложение 1</div>
    <div class="attachmentFile">Вложение 2</div>
</tr>

Из этого кода мы можем извлечь несколько важных информаций:

  • Данные об участнике (которые мы будем называть записью) всегда находятся между элементами <tr id="coomment-xxxx" class="comment byuser comment-author-xxxx …">. Мы можем быть уверены, что внутри класса всегда есть comment.
  • В каждой записи есть имя участника, заключенное в элемент <div class="author">.
  • Если запись содержит вложение, то появляется элемент <div class"attachmentFile"> внутри него. Каждое вложение будет иметь свой собственный элемент <div>, поэтому количество этих элементов будет равно количеству вложенных файлов.
  • Иногда у участника имя не соответствует его полному имени. Например, его настоящее имя - Рахмат Назали, но отображается rahmatnzl. В этом случае нам понадобится система сопоставления, которая точно сопоставит rahmatnzl с "Рахмат Назали". К счастью, есть элемент <p>, который содержит название предмета и имя участника (например, "Анализ случая - Рахмат Назали"). Таким образом, если возникает случай, когда имя не совпадает, мы можем взять имя участника отсюда в качестве резервной копии. Чтобы упростить, далее информацию, находящуюся внутри элемента <p>, мы будем называть заголовком записи.
  • Если участник не сдал задание, его имя не отображается на административной странице. Однако нам нужны данные обо всех участниках тренинга. Чтобы решить эту проблему, мы будем делать сводку, ориентируясь на список имен, полученный из файла Excel.

Вот все, что мы можем извлечь, теперь перейдем к самой интересной части!

Нгодинг

Некоторые используемые мной технологии:


Шаг первый: Подготовка. Мы импортируем необходимые модули и объявляем finalDict и filelist.


Затем мы заполняем finalDict именами всех участников тренинга на основе файла с именем nameList, который содержит список имен участников по одному на каждой строке. Для каждого участника я предоставляю три атрибута:


Шаг второй: Основной процесс. После завершения подготовки мы переходим к основному коду для выполнения парсинга.


Шаг последний: Принятие решения. На этом этапе мы будем присваивать статус каждому участнику в соответствии с количеством прикрепленных файлов, которые они предоставили. Не забываем также сортировать по имени участника, чтобы данные отображались в алфавитном порядке. Этот этап завершается печатью всех обработанных сводных данных.

Учебный эксперимент

Когда я запустил вышеуказанный набор кода, я получил следующий результат:

Gambar 3. Contoh hasil script. Tiap baris selalu dimulai dengan karakter V, X, atau -

На каждой строке будет выведена информация о сдаче задания каждым участником в следующем формате:

[статус сдачи] [имя участника] | [количество вложений] | [название]

Скрипт завершается менее чем за 5 секунд :D

Завершение

Конечно, полученный результат еще нельзя сразу вставить в Excel. Я решил вывести полную информацию, чтобы в случае ошибки мы могли сразу определить, какое имя вызывает ошибку и какой случай приводит к ошибке.

Фактически, нам нужна только информация о статусе сдачи (первая цифра в каждой строке). Учитывая, что имена, выведенные скриптом, уже отсортированы в соответствии с списком имен участников в Excel (так как они были отсортированы), моя следующая задача:

  • Скопировать и вставить все результаты скрипта выше в Excel, начиная с 2 строки, так как имена участников начинаются со 2 строки.
  • Я использую функцию LEFT в Excel: =LEFT(cell, 1).

Тогда результат будет выглядеть следующим образом:

Результат

С помощью подобного скрипта мы можем выполнить работу, которая обычно занимает 1-2 недели, всего за 30 минут. Ура!

Заключение

Начиная с этого момента и впредь, если у меня появится подобная работа, мне просто нужно будет немного изменить переменные, запустить этот скрипт снова, и затем я смогу использовать свободное время на следующей неделе, чтобы выпить горячий чай :D

Конечно, этот текст все еще имеет много недостатков, как в языке, так и в технической стороне программирования, и других аспектах. Я открыт для предложений/рекомендаций.

Спасибо и надеюсь, что это будет полезно.