Парсинг 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 шт):
Вообще вам стоит понять как ваш код работает. Метод 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 != ""]