Untitled
unknown
plain_text
3 years ago
9.3 kB
13
Indexable
import csv
import re
import sys
import prettytable
from prettytable import PrettyTable
main_table = PrettyTable()
main_table_titles = []
COUNTER = 0
dic_naming = {
"name": "Название",
"description": "Описание",
"key_skills": "Навыки",
"experience_id": "Опыт работы",
"premium": "Премиум-вакансия",
"employer_name": "Компания",
"salary_from": "Нижняя граница вилки оклада",
"salary_to": "Верхняя граница вилки оклада",
"salary_gross": "Оклад указан до вычета налогов",
"salary_currency": "Идентификатор валюты оклада",
"area_name": "Название региона",
"published_at": "Дата и время публикации вакансии",
}
exp_naming = {
"noExperience": "Нет опыта",
"between1And3": "От 1 года до 3 лет",
"between3And6": "От 3 до 6 лет",
"moreThan6": "Более 6 лет"
}
currency_naming = {
"AZN": "Манаты",
"BYR": "Белорусские рубли",
"EUR": "Евро",
"GEL": "Грузинский лари",
"KGS": "Киргизский сом",
"KZT": "Тенге",
"RUR": "Рубли",
"UAH": "Гривны",
"USD": "Доллары",
"UZS": "Узбекский сум",
}
filter_dict = {
"Название": lambda vac, req: vac["name"] == req[1],
"Описание": lambda vac, req: vac["description"] == req[1],
"Навыки": lambda vac, req: compare_skills(req, vac),
"Опыт работы": lambda vac, req: exp_naming[vac["experience_id"]] == req[1],
"Премиум-вакансия": lambda vac, req: tryConvertBoolToRussian(vac["premium"]) == req[1],
"Компания": lambda vac, req: vac["employer_name"] == req[1],
"Оклад": lambda vac, req: int(vac["salary_from"]) <= int(req[1]) <= int(vac["salary_to"]),
"Идентификатор валюты оклада": lambda vac, req: currency_naming[vac["salary_currency"]] == req[1],
"Название региона": lambda vac, req: vac["area_name"] == req[1],
"Дата публикации вакансии": lambda vac, req: vac["published_at"][8:10] + "." + vac["published_at"][5:7] + "." \
+ vac["published_at"][:4] == req[1],
}
def compare_skills(requirement, vacancy):
requirement[1] = requirement[1].split(', ')
if isinstance(vacancy["key_skills"], list):
for elem in requirement[1]:
if elem not in vacancy["key_skills"]:
return False
return True
return requirement[1][0] in [vacancy["key_skills"]]
def check_row(row: list, length: int) -> bool:
if len(row) != length:
return False
for elem in row:
if elem.strip() == "":
return False
return True
def csv_reader(file_name: str) -> tuple:
with open(file_name, encoding='utf-8-sig') as file:
file_reader = csv.reader(file, delimiter=",")
try:
first_row = file_reader.__next__()
except BaseException:
print("Пустой файл")
sys.exit()
length = len(first_row)
filled_vacancies = []
for row in file_reader:
if check_row(row, length):
filled_vacancies.append(row)
if len(filled_vacancies) == 0:
print('Нет данных')
sys.exit()
return first_row, filled_vacancies
def convert_list_to_dict(titles: list, vacancy: list) -> dict:
return {titles[i]: vacancy[i] for i in range(len(titles))}
def csv_filer(filled_vacancies: list, titles: list) -> list:
return [convert_list_to_dict(titles, vacancy) for vacancy in filled_vacancies]
def try_to_split(value: str):
if value.__contains__("\n"):
value = value.split("\n")
value = [value[i].strip() for i in range(len(value))]
return value
def process_value(value: str):
new_value = re.sub(r'<[^>]*>', "", value)
new_value = re.sub(" +", " ", new_value)
new_value = re.sub(" ", " ", new_value)
new_value = re.sub(" ", " ", new_value)
if new_value[0] == " ":
new_value = new_value[1:]
if new_value[-1] == " ":
new_value = new_value[:-1]
new_value = re.sub(" +", " ", new_value)
new_value = try_to_split(new_value)
return new_value
def process_each_vacancy(vacancy: list) -> list:
return [process_value(vacancy[i]) for i in range(len(vacancy))]
def get_processed_vacancy_list(vacancies: list) -> list:
return [process_each_vacancy(vacancy) for vacancy in vacancies]
def tryConvertBoolToRussian(value: bool):
if value == "True":
return "Да"
elif value == "False":
return "Нет"
return value
def process_salary(salary: str) -> str:
result_salary = salary.strip()
result_salary = result_salary.split(".")[0]
return result_salary[:-3] + " " + result_salary[-3:] if len(result_salary) > 3 else result_salary
def cut_string(string: str) -> str:
string = str(string)
return f'{string[:100]}...' if len(string) > 100 else string
def format_key_skills(row_vacancy: dict) -> str:
if isinstance(row_vacancy["key_skills"], list):
return "\n".join(row_vacancy["key_skills"])
else:
return row_vacancy["key_skills"]
def format_salary_gross(row_vacancy: dict) -> str:
result = f'{process_salary(row_vacancy["salary_from"])} - {process_salary(row_vacancy["salary_to"])} ' \
f'({currency_naming[row_vacancy["salary_currency"]]}) '
result += "(Без вычета налогов)" if row_vacancy["salary_gross"] == "True" else "(С вычетом налогов)"
return result
def is_filtered_vacancy(requirement: str, vacancy: dict) -> bool:
if requirement == '':
return True
if not requirement.__contains__(':'):
print('Формат ввода некорректен')
exit()
requirement = requirement.split(':')
requirement[1] = requirement[1][1:]
if not filter_dict.__contains__(requirement[0]):
print("Параметр поиска некорректен")
exit()
return filter_dict[requirement[0]](vacancy, requirement)
def formatter(row_vacancy: dict, count: int) -> dict:
global COUNTER
global main_table, main_table_titles
formatted_dict = {"№": count, dic_naming["name"]: row_vacancy["name"],
dic_naming["description"]: row_vacancy["description"],
dic_naming["key_skills"]: format_key_skills(row_vacancy),
dic_naming["experience_id"]: exp_naming[row_vacancy["experience_id"]],
dic_naming["premium"]: tryConvertBoolToRussian(row_vacancy["premium"]),
dic_naming["employer_name"]: row_vacancy["employer_name"],
"Оклад": format_salary_gross(row_vacancy), dic_naming["area_name"]: row_vacancy["area_name"],
"Дата публикации вакансии": row_vacancy["published_at"][8:10] \
+ "." + row_vacancy["published_at"][5:7] + "." \
+ row_vacancy["published_at"][:4]}
main_table.field_names = formatted_dict.keys()
main_table_titles = formatted_dict.keys()
main_table.max_width = 20
new_row = [cut_string(formatted_dict[key]) for key in formatted_dict.keys()]
main_table.add_row(new_row)
COUNTER += 1
return formatted_dict
def print_vacancies(data_vacancies: list, filter_parameters: str) -> None:
global main_table_titles
count = 1
for vacancy in data_vacancies:
if not is_filtered_vacancy(filter_parameters, vacancy):
continue
formatter(vacancy, count)
count += 1
def get_input_values() -> dict:
return {'file_name': input(), 'filter_parameters': input(), 'limits_input': input(), 'titles_input': input()}
def configure_table(inputs: dict) -> None:
global main_table
main_table.field_names = main_table_titles
if inputs['limits_input']:
limits = list(map(int, inputs['limits_input'].split(' ')))
main_table.start = limits[0] - 1
if len(limits) == 2:
main_table.end = limits[1] - 1
if inputs['titles_input']:
titles = inputs['titles_input'].split(', ') + ['№']
main_table.fields = titles
main_table.valign = 't'
main_table.align = 'l'
main_table.hrules = prettytable.ALL
def main():
inputs = get_input_values()
list_result = csv_reader(inputs['file_name'])
print_vacancies(csv_filer(get_processed_vacancy_list(list_result[1]), list_result[0]), inputs['filter_parameters'])
if COUNTER == 0:
print("Ничего не найдено")
exit()
configure_table(inputs)
print(main_table.get_string())
main()
Editor is loading...