/
sorokoladka
/
function
Обзор
Документация
Войти
/
sorokoladka
/
function
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
vetka
func.py
192 строки
8 KB
Anna S
dz
11 ноя 2024, 15:19
11 ноя 2024, 15:19
8e0832e
Код
Авторство
О чём код?
import csv def read_csv_data(filename: str): """ Читает данные из csv-файла и возвращает список словарей. :param filename: название файла csv :return: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие """ with open(filename, 'r', encoding='utf-8') as file: reader = csv.reader(file) header = next(reader) data = [] for row in reader: data.append(dict(zip(header, row))) return data def get_departments(data: list): """ Создаёт список из уникальных департаментов. :param data: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие :return: список из уникальных департаментов """ departments = [] for row in data: row_values = list(row.values())[0] row_list = row_values.split(';') if row_list[1] not in departments: departments.append(row_list[1]) return departments def get_teams(data: list): """ Создаёт словарь департамент - команды, которые входят в департамент. :param data: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие :return: словарь, где ключ - название департамента, а значение - список из уникальных команд """ departments = get_departments(data) teams = {col: [] for col in departments} for row in data: row_values = list(row.values())[0] row_list = row_values.split(';') for department in departments: if (row_list[1] == department and row_list[2] not in teams[department]): teams[department].append(row_list[2]) return teams def item_first(data: list): """ Выводит иерархию команд по департаментам. :param data: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие """ departments = get_departments(data) teams = get_teams(data) for department in departments: print(f'Департамент: {department}') print(f'Команды: {", ".join(str(team) for team in teams[department])}') print() def departments_salaries(data): """ Создаёт словарь департамент - зарплаты сотрудников из этого депаратмента. :param data: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие :return: словарь, где ключ - название департамента, а значение - список зарплат сотрудников этого департамента """ departments = get_departments(data) departments_salaries = {col: [] for col in departments} for row in data: row_values = list(row.values())[0] row_list = row_values.split(';') for department in departments: if department == row_list[1]: (departments_salaries[department] .append(float(row_list[5]))) return departments_salaries def get_salary_items(data): """ Создаёт словарь из характеристик (численность работников, вилка зарплат, средняя зарплата) по департаментам. :param data: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие :return: словарь, где ключи - названия департаментов, а значения - соответствующие характеристики (численность работников, вилка зарплат, средняя зарплата) """ departments = get_departments(data) departments_salaries_dict = departments_salaries(data) qty = {col: len(departments_salaries_dict[col]) for col in departments} min_max = {col: (f'{min(departments_salaries_dict[col])} - ' + f'{max(departments_salaries_dict[col])}') for col in departments} avg = {col: sum(departments_salaries_dict[col]) / len(departments_salaries_dict[col]) for col in departments} merged_dict = {col: [qty[col], min_max[col], avg[col]] for col in departments} return merged_dict def item_second(data): """ Выводит сводный отчет по департаментам. :param data: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие """ salary_items = get_salary_items(data) for department in salary_items.keys(): print(f'Департамент: {department}') print('Сводный отчёт.') print(f'Численность: {salary_items[department][0]}') print(f'Вилка: {salary_items[department][1]}') print(f'Среднее: {salary_items[department][2]}') print() def save_salary_items(data, filename): """ Сохраняет сводные данные по департаментам в csv-файл. :param data: список словарей, где ключ - названия всех столбцов через двоеточие, а значение - соответсвующие значения столбцов через двоеточие :param filename: имя файла CSV для сохранения """ salary_items = get_salary_items(data) with open(filename, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(['Департамент', 'Численность', 'Вилка', 'Среднее']) for department, stats in salary_items.items(): writer.writerow([department, stats[0], stats[1], stats[2]]) def main(filename): """ Основная функция программы. """ data = read_csv_data(filename) while True: print('Меню:') print('Иерархия команд') print('Сводный отчет') print('Сохранить сводный отчет') print('Выйти из меню') choice = input('Выберите пункт из меню \n') if choice == 'Иерархия команд': item_first(data) elif choice == 'Сводный отчет': item_second(data) elif choice == 'Сохранить сводный отчет': output_filename = input('Введите имя файла csv для сохранения: ') save_salary_items(data, output_filename) print(f'Сводный отчет сохранен в файл {output_filename}') elif choice == 'Выйти из меню': break else: print('Не соответствует ни одному из пунктов меню') if __name__ == '__main__': main('Corp_Summary.csv')