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

Rodegast
1) У тебя года должны из файла считываться, а не быть жёстко прописаны в коде.
2) Разбей через .split(“<tr>”) текст на список строк в цикле анализируй каждую строку. Так будет намного проще.
vic57
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')
SomethingButNotNickName
vic57
SomethingButNotNickName вы не ищете легких путей
ModuleNotFoundError: No module named ‘lxml’
вот что получено в результате запуска вашего кода.
Можно поподробнее?
marvellik
это получено в результате того что у вас нет библиотеки lxml.
а теперь подробней. запускаете cmd от имени администратора прописываете в строке приглашения ввода
pip install lxml жмем ввод,ждем установку, пользуемся.
SomethingButNotNickName
marvellik
это получено в результате того что у вас нет библиотеки lxml.а теперь подробней. запускаете cmd от имени администратора прописываете в строке приглашения вводаpip install lxml жмем ввод,ждем установку, пользуемся.

Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB