mikhailemv

Untitled

Oct 31st, 2022
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.12 KB | None | 0 0
  1. # 4.1
  2.  
  3. import csv
  4. import re
  5. import os
  6. from prettytable import PrettyTable
  7.  
  8. MAX_WIDTH = 20
  9. H_RULES = True
  10.  
  11. dic_naming = \
  12.     {
  13.         'name': 'Название',
  14.         'description': 'Описание',
  15.         'key_skills': 'Навыки',
  16.         'experience_id': 'Опыт работы',
  17.         'premium': 'Премиум-вакансия',
  18.         'employer_name': 'Компания',
  19.         'salary_from': 'Нижняя граница вилки оклада',
  20.         'salary_to': 'Верхняя граница вилки оклада',
  21.         'salary_gross': 'Оклад указан до вычета налогов',
  22.         'salary_currency': 'Идентификатор валюты оклада',
  23.         'area_name': 'Название региона',
  24.         'published_at': 'Дата публикации вакансии',
  25.         'salary': 'Оклад'
  26.     }
  27.  
  28. dic_currency = \
  29.     {
  30.         "AZN": "Манаты",
  31.         "BYR": "Белорусские рубли",
  32.         "EUR": "Евро",
  33.         "GEL": "Грузинский лари",
  34.         "KGS": "Киргизский сом",
  35.         "KZT": "Тенге",
  36.         "RUR": "Рубли",
  37.         "UAH": "Гривны",
  38.         "USD": "Доллары",
  39.         "UZS": "Узбекский сум"
  40.     }
  41.  
  42. dic_words = \
  43.     {
  44.         "noExperience": "Нет опыта",
  45.         "between1And3": "От 1 года до 3 лет",
  46.         "between3And6": "От 3 до 6 лет",
  47.         "moreThan6": "Более 6 лет"
  48.     }
  49.  
  50. dic_gross = \
  51.     {
  52.         "True": "Без вычета налогов",
  53.         "False": "С вычетом налогов"
  54.     }
  55.  
  56. dic_bool = \
  57.     {
  58.         "False": "Нет",
  59.         "True": "Да"
  60.     }
  61.  
  62. dic_moneyWord = ["salary_from", "salary_to", "salary_gross", "salary_currency"]
  63.  
  64.  
  65. def parse_indexes(number_row: str, count: int) -> list:
  66.     if len(number_row) == 0:
  67.         return [1, count + 1]
  68.  
  69.     result = number_row.split()
  70.  
  71.     if len(result) <= 3:
  72.         result.append(count + 1)
  73.     for elem in range(len(result)):
  74.         result[elem] = int(result[elem])
  75.  
  76.     return result
  77.  
  78.  
  79. def parse_headlines(titles_table: str) -> list:
  80.     if len(titles_table) == 0:
  81.         return list()
  82.     result = titles_table.split(', ')
  83.     result.insert(0, '№')
  84.     return result
  85.  
  86.  
  87. def is_right_row(row: dict, list_naming: list) -> bool:
  88.     return ((len(row) == len(list_naming)) &
  89.             (not ((None in row) | ("" in row))))
  90.  
  91.  
  92. def reverse_number(number: str) -> str:
  93.     final_value: str = ''
  94.     point = number.split('.')[0][::-1]
  95.     count = len(point) // 3 * 3
  96.  
  97.     for i in range(0, count, 3):
  98.         final_value += ' ' + point[i:i+3]
  99.  
  100.     if not len(point) % 3 == 0:
  101.         final_value = final_value + ' ' + point[count - len(point):]
  102.  
  103.     return final_value[::-1][:len(final_value) - 1]
  104.  
  105.  
  106. def formatter(current_row: dict) -> dict:
  107.     for elem in current_row:
  108.         if len(current_row[elem]) >= 100:
  109.             current_row[elem] = current_row[elem][:100] + "..."
  110.  
  111.     format_dict = dict()
  112.  
  113.     money = f'{reverse_number(current_row["salary_from"])} - {reverse_number(current_row["salary_to"])} ' \
  114.             f'({dic_currency[current_row["salary_currency"]]}) ({dic_gross[current_row["salary_gross"]]})'
  115.  
  116.     list_time = current_row['published_at'].split('-')
  117.     list_time[2] = list_time[2][0] + list_time[2][1]
  118.  
  119.     current_row['published_at'] = f'{list_time[2]}.{list_time[1]}.{list_time[0]}'
  120.     current_row['experience_id'] = dic_words[current_row['experience_id']]
  121.  
  122.     current_row["salary_gross"] = dic_bool[current_row["salary_gross"]]
  123.     current_row["premium"] = dic_bool[current_row["premium"]]
  124.  
  125.     for headline in current_row:
  126.         if headline == 'salary_from':
  127.             format_dict['salary'] = money
  128.  
  129.         if headline in dic_moneyWord:
  130.             continue
  131.  
  132.         format_dict[headline] = current_row[headline]
  133.  
  134.     return format_dict
  135.  
  136.  
  137. def print_vacancies(data_vacancies: list, indexes_row: list,
  138.                     headlines_table: list) -> None:
  139.     start_index, stop_index = indexes_row[0] - 1, indexes_row[1] - 1
  140.     formatted_vacancies_list = list()
  141.     for vacancy in data_vacancies:
  142.         formatted_vacancies_list.append(formatter(vacancy))
  143.  
  144.     titles_list = list()
  145.     if not len(formatted_vacancies_list) == 0:
  146.  
  147.         for title in formatted_vacancies_list[0].keys():
  148.             titles_list.append(dic_naming[title])
  149.         titles_list.insert(0, "№")
  150.  
  151.         table = PrettyTable(titles_list)
  152.  
  153.         for title in titles_list:
  154.             table._max_width[title] = MAX_WIDTH
  155.  
  156.         table.hrules = H_RULES
  157.         table.align = "l"
  158.  
  159.         counter = 1
  160.         for vacancy in formatted_vacancies_list:
  161.             row = list(vacancy.values())
  162.             row.insert(0, counter)
  163.             table.add_row(row)
  164.             counter += 1
  165.  
  166.         if len(headlines_table) == 0:
  167.             print(table.get_string(start=start_index,
  168.                                    end=stop_index))
  169.         else:
  170.             print(table.get_string(start=start_index,
  171.                                    end=stop_index,
  172.                                    fields=headlines_table))
  173.  
  174.     else:
  175.         print("Нет данных")
  176.  
  177.  
  178. def csv_filer(reader: tuple, list_naming: tuple) -> list:
  179.     vacancies_list = list()
  180.     for vacancy in reader:
  181.         if is_right_row(row=vacancy, list_naming=list_naming):
  182.             for elem in range(0, len(vacancy), 1):
  183.                 vacancy[elem] = re.sub(re.compile('<.*?>'), '', vacancy[elem])
  184.                 if not elem == 2:
  185.                     vacancy[elem] = ' '.join(vacancy[elem].split())
  186.             vacancies_list.append({k: v for k, v in zip(list_naming, vacancy)})
  187.  
  188.     return vacancies_list
  189.  
  190.  
  191. def csv_reader(csv_name: str) -> tuple:
  192.     with open(csv_name, encoding='utf-8-sig') as file:
  193.         readers = csv.reader(file)
  194.         real_reader = readers.__next__()
  195.         title = [row for row in readers]
  196.         return real_reader, title
  197.  
  198.  
  199. file_name = input()
  200. indexes_list = input()
  201. needed_headlines = input()
  202.  
  203. if not os.stat(file_name).st_size != 0:
  204.     print("Пустой файл")
  205. else:
  206.     raw_reader = csv_reader(csv_name=file_name)
  207.     list_dictionaries = csv_filer(reader=raw_reader[1],
  208.                                   list_naming=raw_reader[0])
  209.  
  210.     print_vacancies(data_vacancies=list_dictionaries,
  211.                     indexes_row=parse_indexes(indexes_list, len(list_dictionaries)),
  212.                     headlines_table=parse_headlines(needed_headlines))
  213.                    
  214. # 4.2
  215.  
  216. import sys
  217. import re
  218. import csv
  219. import math
  220. from prettytable import PrettyTable, ALL
  221.  
  222. HRULES = ALL
  223. ALIGN = 'l'
  224. MAX_WIDTH = 20
  225.  
  226. headlines_filter = [
  227.     "№", "Название", "Описание", "Навыки", "Опыт работы",
  228.     "Премиум-вакансия", "Компания", "Оклад", "Название региона",
  229.     "Дата публикации вакансии", "Идентификатор валюты оклада"]
  230.  
  231. headlines_table = [
  232.     "№", "Название", "Описание", "Навыки", "Опыт работы",
  233.     "Премиум-вакансия", "Компания", "Оклад", "Название региона", "Дата публикации вакансии"]
  234.  
  235. salary_currency = \
  236.     {
  237.         "AZN": "Манаты",
  238.         "BYR": "Белорусские рубли",
  239.         "EUR": "Евро",
  240.         "GEL": "Грузинский лари",
  241.         "KGS": "Киргизский сом",
  242.         "KZT": "Тенге",
  243.         "RUR": "Рубли",
  244.         "UAH": "Гривны",
  245.         "USD": "Доллары",
  246.         "UZS": "Узбекский сум"
  247.     }
  248.  
  249. experience_translator = \
  250.     {
  251.         "noExperience": "Нет опыта",
  252.         "between1And3": "От 1 года до 3 лет",
  253.         "between3And6": "От 3 до 6 лет",
  254.         "moreThan6": "Более 6 лет"
  255.     }
  256.  
  257.  
  258. def get_entered_columns(columns: str) -> list:
  259.     return columns.split(', ') if len(columns) > 3 else headlines_table
  260.  
  261.  
  262. def get_filtered_key(key: str) -> str:
  263.     if len(key) == 0:
  264.         return ''
  265.     if not key.count(':'):
  266.         print("Формат ввода некорректен")
  267.         sys.exit()
  268.     if not headlines_filter.count(key.split(':')[0]):
  269.         print("Параметр поиска некорректен")
  270.         sys.exit()
  271.     return key.split(': ')
  272.  
  273.  
  274. def get_right_salary_format(slr) -> str:
  275.     return '{:,}'.format(math.floor(float(slr))).replace(',', ' ')
  276.  
  277.  
  278. def is_sublist(full_list: list, small_list: list) -> bool:
  279.     counter = 0
  280.     for value in small_list:
  281.         if full_list.count(value):
  282.             counter += 1
  283.  
  284.     return len(small_list) == counter
  285.  
  286.  
  287. def get_filtered_vacancies(vacancies_list: list, keys_for_filtering: list) -> list:
  288.     filtered_vacancies_list = list()
  289.     for vacancy in vacancies_list:
  290.         if filtering[keys_for_filtering[0]](vacancy,
  291.                                             keys_for_filtering[1]):
  292.             filtered_vacancies_list.append(vacancy)
  293.     if len(filtered_vacancies_list) == 0:
  294.         print('Ничего не найдено')
  295.         sys.exit()
  296.     return filtered_vacancies_list
  297.  
  298.  
  299. def print_table(vacancies_list: list, columns: list,
  300.                 to_end: list) -> None:
  301.     counter = 1
  302.     table = PrettyTable()
  303.     table.hrules = HRULES
  304.     table.align = ALIGN
  305.     table.field_names = headlines_table
  306.  
  307.     for headlines in table.field_names:
  308.         table.max_width[headlines] = MAX_WIDTH
  309.  
  310.     for vacancy in vacancies_list:
  311.         array_to_count = [counter]
  312.         for value in headlines_table[1:]:
  313.             temp = formatter[value](vacancy)
  314.             array_to_count.append(temp if len(temp) < 100 else temp[:100] + '...')
  315.         table.add_row(array_to_count)
  316.         counter += 1
  317.  
  318.     if len(to_end) > 1:
  319.         print(table.get_string(start=to_end[0] - 1, end=to_end[1] - 1, fields=columns))
  320.     elif len(to_end) == 1:
  321.         print(table.get_string(start=to_end[0] - 1, fields=columns))
  322.     else:
  323.         print(table.get_string(fields=columns))
  324.  
  325.  
  326. def csv_reader(csv_name: str) -> list:
  327.     with open(csv_name, encoding='utf-8-sig') as read_file:
  328.         file_reader = csv.reader(read_file, delimiter=',')
  329.         vacancies_list = list()
  330.         try:
  331.             titles = next(file_reader)
  332.         except StopIteration:
  333.             print('Пустой файл')
  334.             sys.exit(0)
  335.         for row in file_reader:
  336.             vacancies_list.append(row)
  337.         if len(vacancies_list) == 0:
  338.             print('Нет данных')
  339.             sys.exit(0)
  340.         return [vacancies_list, titles]
  341.  
  342.  
  343. def csv_filer(raw_reader: list, headlines: list) -> list:
  344.     vacancies_list = list()
  345.     index_key_skills = headlines.index('key_skills')
  346.     html_tags = re.compile('<.*?>')
  347.     for vacancy in raw_reader:
  348.         try:
  349.             vacancy.remove('')
  350.         except ValueError:
  351.             pass
  352.         for i in range(len(vacancy)):
  353.             if i != index_key_skills:
  354.                 vacancy[i] = ' '.join(re.sub(html_tags, '', vacancy[i]).strip().split())
  355.             else:
  356.                 vacancy[i] = list(map(lambda x: x.strip(), vacancy[i].split('\n')))
  357.  
  358.         if len(vacancy) == len(headlines):
  359.             vacancies_list.append({headlines[i]: vacancy[i]
  360.                                    for i in range(len(headlines))})
  361.  
  362.     return vacancies_list
  363.  
  364.  
  365. formatter = \
  366.     {
  367.         'Название': lambda row: row['name'],
  368.         'Описание': lambda row: row['description'],
  369.         'Навыки': lambda row: "\n".join(row['key_skills']),
  370.         'Опыт работы': lambda row: experience_translator[row['experience_id']],
  371.         'Премиум-вакансия': lambda row: 'Да' if row['premium'] == 'True' else 'Нет',
  372.         'Компания': lambda row: row['employer_name'],
  373.         'Оклад': lambda row: f'{get_right_salary_format(row["salary_from"])} - '
  374.                              f'{get_right_salary_format(row["salary_to"])} '
  375.                              f'({salary_currency[row["salary_currency"]]}) '
  376.                              f'({"Без вычета налогов" if row["salary_gross"] == "True" else "С вычетом налогов"})',
  377.         'Название региона': lambda row: row['area_name'],
  378.         'Дата публикации вакансии': lambda row: '.'.join(reversed(row['published_at'][0:10].split('-')))
  379.     }
  380.  
  381. filtering = \
  382.     {
  383.         'Название': lambda row, key: row['name'] == key,
  384.         'Описание': lambda row, key: row['description'] == key,
  385.         'Навыки': lambda row, key: is_sublist(row['key_skills'], key.split(', ')),
  386.         'Опыт работы': lambda row, key: experience_translator[row['experience_id']] == key,
  387.         'Премиум-вакансия': lambda row, key: ('Да' if row['premium'] == 'True' else 'Нет') == key,
  388.         'Компания': lambda row, key: row['employer_name'] == key,
  389.         'Идентификатор валюты оклада': lambda row, key: salary_currency[row['salary_currency']] == key,
  390.         'Оклад': lambda row, key:
  391.             math.floor(float(row['salary_from'])) <= math.floor(float(key)) <=
  392.             math.floor(float(row['salary_to'])),
  393.         'Название региона': lambda row, key: row['area_name'] == key,
  394.         'Дата публикации вакансии': lambda row, key: '.'.join(reversed(row['published_at'][0:10].split('-'))) == key
  395.     }
  396.  
  397. file_name = input()
  398. keys_to_filter = get_filtered_key(input())
  399. limits = list(map(lambda x: int(x), input().split()))
  400. needed_columns = get_entered_columns(f'№, {input()}')
  401. reader = csv_reader(csv_name=file_name)
  402. data_vacancies = csv_filer(raw_reader=reader[0],
  403.                            headlines=reader[1])
  404.  
  405. if len(keys_to_filter) > 0:
  406.     data_vacancies = get_filtered_vacancies(vacancies_list=data_vacancies,
  407.                                             keys_for_filtering=keys_to_filter)
  408.  
  409. print_table(vacancies_list=data_vacancies,
  410.             columns=needed_columns,
  411.             to_end=limits)
Add Comment
Please, Sign In to add comment