Парсинг TXT файла с расписанием

Есть документ с таким содержимым:

| Понедельник | 9:00  | Математика | Практика | Иванов Иван Иванович |
| Понедельник | 10:40  | Математика | Лекция | Иванов Иван Иванович |
| Понедельник | 12:40  | Математика | Лекция | Иванов Иван Иванович |
| Вторник | 10:40  | История | Лекция | Иванов Иван Иванович |
| Вторник | 12:40  | История/Обществознание | Лекция | Иванов Иван Иванович |
| Вторник | 14:20  | История/Обществознание | Лекция | Иванов Иван Иванович |
| Вторник | 16:20  | Безопасность жизнедеятельности | Лекция | Иванов Иван Иванович |
| Среда | 9:00  | Русский язык | Лекция (17.01, 31.01, 14.02, 28.02, 13.03, 27.03, 10.04, 24.04, 08.05) | Иванов Иван Иванович |
| Среда | 12:40  | Литература | Лекция (12.01-14.06) | Иванов Иван Иванович |
| Среда | 14:20  | Литература | Лекция | Иванов Иван Иванович |
| Четверг | 9:00  | География/Биология/Химия | Практика | Иванов Иван Иванович |
| Четверг | 10:40  | География/Биология/Химия | Лекция | Иванов Иван Иванович |
| Четверг | 12:40  | География/Биология/Химия | Лекция | Иванов Иван Иванович |
| Четверг | 14:20  | География/Биология/Химия | Лекция | Иванов Иван Иванович |
| Пятница | 9:00  | Физика | Практика | Иванов Иван Иванович |
| Пятница | 10:40  | Физическая культура | Практика | Иванов Иван Иванович |
| Пятница | 12:40  | Физика | Практика | Иванов Иван Иванович |

Его необходимо спарсить и отправить в базу данных использую aiomysql для работы с бд, даже предположить не могу как на практике это реализовать. Вот что я попытался сделать:

def parse_schedule(text):
    """
    Разделяет сообщение на составляющие: день недели, время, предмет, дополнительная информация и преподаватель.
    Возвращает список из этих составляющих.
    """

    day_of_week = text.split("|")[0]
    time = text.split("|")[1].split()[0]  # время — это первый элемент после разделения строки по пробелу
    subject = text.split("|")[2].strip()  # предмет — это третий элемент после разделения строки по |, без пробелов в начале и конце
    additional_info = text.split("|")[3].strip()
    teacher = text.split("|")[-1].strip()  # преподаватель — это последний элемент после разделения строки по |, без пробелов в начале и конце

    return [day_of_week, time, subject, additional_info, teacher]

Ответы (1 шт):

Автор решения: kristal

Вообще вам стоит понять как ваш код работает. Метод split(pattern) разделяет строку по патерну переданному в него и возвращает список строк. То есть, для строки | Понедельник | 9:00 | Математика | Практика | Иванов Иван Иванович | c.split("|") вернётся такой список:

['', ' Понедельник ', ' 9:00  ', ' Математика ', ' Практика ', ' Иванов Иван Иванович ', '']

Пустая строка '' возвращается по причине того что перед | ничего не стоит или наоборот. Далее, как работать с коллекциями, я думаю, вы должны понимать. Если обрезать лишние пустые строки вы получите желаемый результат. Или, в вашем случае, если хотите записать результат в переменные, можно сделать срез:

day_of_week, time, subject, additional_info, teacher = text.split("|")[1:-1]

У меня же вышло примерно так:

schedule_string = """
| Понедельник | 9:00  | Математика | Практика | Иванов Иван Иванович |
| Понедельник | 10:40  | Математика | Лекция | Иванов Иван Иванович |
| Понедельник | 12:40  | Математика | Лекция | Иванов Иван Иванович |
| Вторник | 10:40  | История | Лекция | Иванов Иван Иванович |
| Вторник | 12:40  | История/Обществознание | Лекция | Иванов Иван Иванович |
| Вторник | 14:20  | История/Обществознание | Лекция | Иванов Иван Иванович |
| Вторник | 16:20  | Безопасность жизнедеятельности | Лекция | Иванов Иван Иванович |
| Среда | 9:00  | Русский язык | Лекция (17.01, 31.01, 14.02, 28.02, 13.03, 27.03, 10.04, 24.04, 08.05) | Иванов Иван Иванович |
| Среда | 12:40  | Литература | Лекция (12.01-14.06) | Иванов Иван Иванович |
| Среда | 14:20  | Литература | Лекция | Иванов Иван Иванович |
| Четверг | 9:00  | География/Биология/Химия | Практика | Иванов Иван Иванович |
| Четверг | 10:40  | География/Биология/Химия | Лекция | Иванов Иван Иванович |
| Четверг | 12:40  | География/Биология/Химия | Лекция | Иванов Иван Иванович |
| Четверг | 14:20  | География/Биология/Химия | Лекция | Иванов Иван Иванович |
| Пятница | 9:00  | Физика | Практика | Иванов Иван Иванович |
| Пятница | 10:40  | Физическая культура | Практика | Иванов Иван Иванович |
| Пятница | 12:40  | Физика | Практика | Иванов Иван Иванович |
"""


def parse_schedule(line):
    return [i.strip() for i in line.split("|") if i != ""]


schedule_list = [parse_schedule(i) for i in schedule_string.split("\n") if i != ""]
→ Ссылка