Advertisement
mikhailemv

Untitled

Oct 31st, 2022
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement