Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2017 09:59:00

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Критику в студию

Прошу оценить выполнение задачи и высказать замечания.
Условие
“”“Упражнение ”Детские имена“
ЗАГС г. Москвы ведет статистику детских имен. На сайте этой организации
публикуется статистика наиболее популярных имен по году рождения ребенка.
Файлы для этого упражнения находятся в файлах ”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 файл во вложении

Отредактировано SomethingButNotNickName (Дек. 28, 2017 10:01:03)

Прикреплённый файлы:
attachment babynames_girls.html (25,9 KБ)

Офлайн

#2 Дек. 28, 2017 10:35:50

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Критику в студию

1) У тебя года должны из файла считываться, а не быть жёстко прописаны в коде.
2) Разбей через .split(“<tr>”) текст на список строк в цикле анализируй каждую строку. Так будет намного проще.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Дек. 28, 2017 10:46:06

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Критику в студию

SomethingButNotNickName вы не ищете легких путей

 from lxml import html
htm = html.parse('babynames_girls.html')
path = htm.xpath("//tr/descendant-or-self::*")
for i in path:
    if i.tag == 'tr':
        print()
    else:
        print(i.text.strip(),end='\t')

Офлайн

#4 Дек. 29, 2017 12:05:33

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Критику в студию

vic57
SomethingButNotNickName вы не ищете легких путей
ModuleNotFoundError: No module named ‘lxml’
вот что получено в результате запуска вашего кода.
Можно поподробнее?

Офлайн

#5 Дек. 29, 2017 12:22:16

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Критику в студию

это получено в результате того что у вас нет библиотеки lxml.
а теперь подробней. запускаете cmd от имени администратора прописываете в строке приглашения ввода
pip install lxml жмем ввод,ждем установку, пользуемся.

Офлайн

#6 Дек. 29, 2017 12:55:17

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Критику в студию

marvellik
это получено в результате того что у вас нет библиотеки lxml.а теперь подробней. запускаете cmd от имени администратора прописываете в строке приглашения вводаpip install lxml жмем ввод,ждем установку, пользуемся.

Спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version