Информатика. Лабораторная работа №4. вариант 13. Задание

Информатика
Лабораторная работа №4
вариант 13
Санкт-Петербург, 2018 г.
Задание
1. Изучить форму Бэкуса-Наура.
2. Изучить особенности языков разметки/форматов JSON, YAML, XML, PROTOBUF.
3. Понять устройство страницы с расписанием для своей группы.
4. Исходя из структуры расписания конкретного дня сформировать файл с расписанием в формате, указанном в задании в качестве исходного.
5. Написать программу на языке Python, которая бы осуществляла парсинг и конвертацию исходного файла в новый. НЕЛЬЗЯ использовать готовые библиотеки, кроме re (регулярные выражения в Python)!
Вариант 13: XML -> JSON, среда
Исходный файл:
<friday> <even> <lesson> <time>08:20-09:50</time> <classroom>304</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ДИСКРЕТНАЯ МАТЕМАТИКА (ПРАК)</subject> <teacher>Раков Сергей Валентинович</teacher> </lesson> <lesson> <time>10:00-11:30</time> <classroom>304</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ДИСКРЕТНАЯ МАТЕМАТИКА (ПРАК)</subject> <teacher>Раков Сергей Валентинович</teacher> </lesson> <lesson> <time>11:40-13:10</time> <classroom>466</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ОСНОВЫ ПРОФЕССИОНАЛЬНОЙ ДЕЯТЕЛЬНОСТИ (ЛЕК)</subject> <teacher>Клименков Сергей Викторович</teacher> </lesson> <lesson> <time>13:30-15:00</time> <classroom>466</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ПРОГРАММИРОВАНИЕ (ЛЕК)</subject> <teacher>Письмак Алексей Евгеньевич</teacher> </lesson> </even> <odd> <lesson> <time>11:40-13:10</time> <classroom>466</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ИНФОРМАТИКА (ЛЕК)</subject> <teacher>Балакшин Павел Валерьевич</teacher> </lesson> <lesson> <time>13:30-15:00</time> <classroom>466</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ДИСКРЕТНАЯ МАТЕМАТИКА (ЛЕК)</subject> <teacher>Поляков Владимир Иванович</teacher> </lesson> <lesson> <time>15:20-16:50</time> <classroom>304</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ИНФОРМАТИКА (ЛАБ)</subject> <teacher>Калинин Игорь Владимирович</teacher> </lesson> <lesson> <time>17:00-18:30</time> <classroom>304</classroom> <place>Кронверкский пр., д.49, лит.А</place> <subject>ИНФОРМАТИКА (ЛАБ)</subject> <teacher>Калинин Игорь Владимирович</teacher> </lesson> </odd> </friday>
Выходной файл:
{ "friday" : { "even" : { "lesson" : [ { "time" : "08:20-09:50", "classroom" : "304", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ДИСКРЕТНАЯ МАТЕМАТИКА (ПРАК)", "teacher" : "Раков Сергей Валентинович" }, { "time" : "10:00-11:30", "classroom" : "304", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ДИСКРЕТНАЯ МАТЕМАТИКА (ПРАК)", "teacher" : "Раков Сергей Валентинович" }, { "time" : "11:40-13:10", "classroom" : "466", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ОСНОВЫ ПРОФЕССИОНАЛЬНОЙ ДЕЯТЕЛЬНОСТИ (ЛЕК)", "teacher" : "Клименков Сергей Викторович" }, { "time" : "13:30-15:00", "classroom" : "466", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ПРОГРАММИРОВАНИЕ (ЛЕК)", "teacher" : "Письмак Алексей Евгеньевич" } ] }, "odd" : { "lesson" : [ { "time" : "11:40-13:10", "classroom" : "466", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ИНФОРМАТИКА (ЛЕК)", "teacher" : "Балакшин Павел Валерьевич" }, { "time" : "13:30-15:00", "classroom" : "466", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ДИСКРЕТНАЯ МАТЕМАТИКА (ЛЕК)", "teacher" : "Поляков Владимир Иванович" }, { "time" : "15:20-16:50", "classroom" : "304", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ИНФОРМАТИКА (ЛАБ)", "teacher" : "Калинин Игорь Владимирович" }, { "time" : "17:00-18:30", "classroom" : "304", "place" : "Кронверкский пр., д.49, лит.А", "subject" : "ИНФОРМАТИКА (ЛАБ)", "teacher" : "Калинин Игорь Владимирович" } ] } } }
Код:
import re xmlFile = open('rasp.xml', 'r', encoding='UTF-8') next(xmlFile) jsonFile = open('rasp.json', 'w', encoding='UTF-8') spaces = " " tab, lessonCount = 0, 0 tagArr = ['friday', 'even', 'odd', 'lesson'] comma = '' endTag = False print('{', file=jsonFile, end='') for line in xmlFile: tag = re.search(r'<(\w+)>', line) if tag: tag = tag.group(1) if tag == 'lesson': jsonLine = '{0}"{1}" : [\n{0}'.format(tab * spaces, tag) if not lessonCount else tab*spaces lessonCount +=1 else: jsonLine = '{}"{}" : '.format(tab * spaces, tag text = re.search(r'>([\w\s.,():-]+)<', line) if text: text = text.group(1) jsonLine += '"{}"'.format(text) print(comma+'\n'+jsonLine, file=jsonFile, end='') else: print((',' if lessonCount>1 else '')+'\n'+jsonLine+'{', file=jsonFile, end='') tab += 1 endTag = False else: tag = re.search(r'</(\w+)>', line).group(1) tab -= 1 if tag == 'lesson': print('\n{0}}}'.format(tab*spaces), file=jsonFile, end='') else: lessonCount = 0 if prevtag == 'lesson': print('\n{0}]\n{0}}}'.format(tab*spaces), file=jsonFile, end='') else: print('\n{0}}}'.format(tab*spaces), file=jsonFile, end='') endTag = True prevtag = tag comma = ',' if prevtag not in tagArr else '' print('\n}', file=jsonFile) xmlFile.close() jsonFile.close()
Вывод:
Я потратила очень много времени в попытках поставить запятые там, где надо (видимо построчный перевод не лучшее решение, зато памяти меньше ест).
|