Условие
“”“Упражнение ”Детские имена“
ЗАГС г. Москвы ведет статистику детских имен. На сайте этой организации
публикуется статистика наиболее популярных имен по году рождения ребенка.
Файлы для этого упражнения находятся в файлах ”babynames_boys.html“ и
”babynames_girls.html". Они содержат сырой HTML-код.
1. Создайте функцию extract_names(filename), которая принимает в качестве
аргумента имя файла и возвращает данные из него в виде словаря вида:
babynames = {
'София, Софья': ['3841 (6,0%)*', ‘3668 (6,2%)’, ‘2127 (4,8%)’,
‘826 (2,4%)’, ‘193 (0,4%)’,],
'Виктория': ,
…
}
Словарь использует в качестве ключа имя ребенка, а в качестве значения -
список, содержащий количесво детей, названных этим именем в соотв. году.
2. Создайте функцию print_names(). Функция получает в качестве аргумента
словарь babynames.Затем:
1. Запрашивает у пользователя интересующий его год.
2. Выводит на печать данные в алфавитном порядке имен:
Александра 1683
Алина 837
Алиса 1239
Алёна, Алена 658
Амина 243
Анастасия 3055 (5,1%)
…
Реализация
import re years = ['2012', '2010', '2005','2000','1990'] path = 'C:\\Users\\Админ\\Desktop\\Python\\lesson04\\babynames\\babynames_girls.html' def extract_names(filename): with open (filename, encoding='utf-8') as f: l = '' for line in f: l += line l = re.sub(r'\n', '', l) # удаление переносов строки и пробелов l = re.sub(r'\s{2,}', '', l) # в анализируемой HTML строке res = re.findall(r'>[^>]+<', l) # вытаскивает все строки между >< res = [x for x in res[:] if x != '> <'] # избавляемся от елементов '> <' for i in range(len(res)): # res[i] = res[i].replace('>', '') # '>text<' -> 'text' res[i] = res[i].replace('<', '') # см выше res = res[17:len(res)-1] # обрезает лишние элементы(заголовки таблицы) for i in reversed(range(len(res[:]))): #удаляет элементы с номером кратным 7 if i in [i for i in range(344) if i % 7 == 0]: #это порядковы номер строки таблицы res.pop(i) # babynames = {i: [] for i in res if res.index(i) % 6 == 0} #создание словаря с ключами - именами детей for key in babynames: #заполнение словаря элементами babynames[key] = [x for x in res if res.index(x) in [1,2,3,4,5]] #в виде списка чисел детей for i in range(6): #с именем-ключом и паралельное опустошение res.pop(0) # списка res для экономии памяти return babynames def print_names(babynames): while True: while True: print('В базе имеется информация за следующие годы' '\n', list(reversed(years)),sep='') inquiry = input('Введите интересующий Вас год. ' '\nДля выхода наберите exit.\n') if inquiry in years or inquiry == 'exit': break else: print('Введенный год отсутствует в базе') if inquiry == 'exit': break for i in sorted(babynames): print('%-16s' % i, ' : ', end='') print(babynames[i][years.index(inquiry)]) answer = input('Продолжить работу y/n? ') if answer != 'y': break print() print('==НАЧАЛО РАБОТЫ СКРИПТА==') babynames = extract_names(path) print_names(babynames) print('==ОКОНЧАНИЕ РАБОТЫ СКРИПТА==')
Собственно сам вижу два “плохих” места:
1) Патерн написан так, что берет много лишнего и от этого лишнего приходится избавляться не самыми изящными способами;
2) Как задать путь к файлу? например чтобы скрипт искал html файл рядом с py-файлом скрипта?
HTML файл во вложении