diff --git a/lesson_5/hometask/Firms.txt b/lesson_5/hometask/Firms.txt new file mode 100644 index 0000000..8dbd38d --- /dev/null +++ b/lesson_5/hometask/Firms.txt @@ -0,0 +1,7 @@ +Horns & Hooves ЗАО -100 5000 +Pigbank ООО 0 100000 +Federates & Co ПАО 50 100500 +Employer ПАО 50000 1000 +Swineld Fancy Flight ООО 100000 3000 +Shavermier Inc ПАО 50000 1000 +Confederat & Co ОООО!!! 1000000.89 10000.79 \ No newline at end of file diff --git a/lesson_5/hometask/Numbers.txt b/lesson_5/hometask/Numbers.txt new file mode 100644 index 0000000..bebef41 --- /dev/null +++ b/lesson_5/hometask/Numbers.txt @@ -0,0 +1,4 @@ +One — 1 +Two — 2 +Four — 4 +Three — 3 diff --git a/lesson_5/hometask/company_dictlist.json b/lesson_5/hometask/company_dictlist.json new file mode 100644 index 0000000..dff9513 --- /dev/null +++ b/lesson_5/hometask/company_dictlist.json @@ -0,0 +1 @@ +[{"Horns & Hooves": -5100, "Pigbank": -100000, "Federates & Co": -100450, "Employer": 49000, "Swineld Fancy Flight": 97000, "Shavermier Inc": 49000, "Confederat & Co": 990000.1}, {"average_profit": 296250.025}] \ No newline at end of file diff --git a/lesson_5/hometask/employeers_salaries.txt b/lesson_5/hometask/employeers_salaries.txt new file mode 100644 index 0000000..9b0c1b5 --- /dev/null +++ b/lesson_5/hometask/employeers_salaries.txt @@ -0,0 +1,11 @@ +Иванов 23543.12 +Петров 13749.32 +Сидоров 31500.48 +Козлов 11111.11 +Псянин 100000.11 +Собакин 19999.99 +Синяков 20000.99 +Косяков 50000.55 +Распиляев 150000.65 +Пукин 160000.99 +Свинятин 40000.10 \ No newline at end of file diff --git a/lesson_5/hometask/get_file_by_files_list.py b/lesson_5/hometask/get_file_by_files_list.py new file mode 100644 index 0000000..d04fd04 --- /dev/null +++ b/lesson_5/hometask/get_file_by_files_list.py @@ -0,0 +1,51 @@ +import os + +def get_number_by_string(string_number: str): + """ + Функция преобразования строки к какому-либо числовому формату + + :param string_number: число в строковом виде + :return: число в числовом формате + """ + try: + return int(string_number) + except ValueError: + # если и тут ошибка, пробрасываем во внешний код + return float(string_number) + +def get_file_by_current_folder(interested_dir='.') -> str: + """ + Функция взаимодейcтвия с командной строкой + Исключительно консольная функция для моих нужд + Выводит список файлов в текущей директории + Позволяет выбрать индекс понравившегося файла + + :param interested_dir: директория поиска файла + :return: адрес файла с названием файла + """ + + files_list = os.listdir() + + if not os.path.isdir(interested_dir): + raise NotADirectoryError(f"Input dir {interested_dir} is non existing dir") + # удалим не "не файлы" из списка файлов + for file in files_list: + if not os.path.isfile(file): + files_list.remove(file) + array_len = len(files_list) + + # выведем файлы, которые пользователь может выбрать + print('Files for choose:') + for index, file in enumerate(files_list): + print(f"{index} or {index - array_len} : {file}") + + # Упорно запрашиваем индекс интересующего файла + while True: + try: + return os.path.join(interested_dir, files_list[int(input("Input the need file index >>>"))]) + except ValueError: + print("Uncorrect input") + continue + except IndexError: + print("Uncorrect file index") + continue diff --git a/lesson_5/hometask/lessons.txt b/lesson_5/hometask/lessons.txt new file mode 100644 index 0000000..74f727b --- /dev/null +++ b/lesson_5/hometask/lessons.txt @@ -0,0 +1,4 @@ +Информатика: 100(л) 50(пр) 20(лаб). +Физика: 30(л) — 10(лаб) +Физкультура: — 30(пр) — +Эритрейский язык: — — — \ No newline at end of file diff --git a/lesson_5/hometask/new_numbers_file.txt b/lesson_5/hometask/new_numbers_file.txt new file mode 100644 index 0000000..a0199e5 --- /dev/null +++ b/lesson_5/hometask/new_numbers_file.txt @@ -0,0 +1,4 @@ +Один — 1 +Два — 2 +Четыре — 4 +Три — 3 diff --git a/lesson_5/hometask/numeric_file.txt b/lesson_5/hometask/numeric_file.txt new file mode 100644 index 0000000..79579d0 --- /dev/null +++ b/lesson_5/hometask/numeric_file.txt @@ -0,0 +1 @@ +53.2 32.2 -3 3 \ No newline at end of file diff --git a/lesson_5/hometask/task_1.py b/lesson_5/hometask/task_1.py new file mode 100644 index 0000000..764b9e9 --- /dev/null +++ b/lesson_5/hometask/task_1.py @@ -0,0 +1,16 @@ +# Создать программно файл в текстовом формате, +# записать в него построчно данные, вводимые пользователем. +# Об окончании ввода данных свидетельствует пустая строка. + +# Файл будет создан в любом случае +# Даже если вводить уже ничего не хочется +with open("task_1_file.txt", "w") as task_file: + while True: + temp_string = input("Input user string to file >>>") + if temp_string == "": + break + try: + task_file.write(temp_string+'\n') + except FileNotFoundError: + print("Unable to process file in unexisting directory") + exit() diff --git a/lesson_5/hometask/task_1_file.txt b/lesson_5/hometask/task_1_file.txt new file mode 100644 index 0000000..71b272b --- /dev/null +++ b/lesson_5/hometask/task_1_file.txt @@ -0,0 +1,4 @@ +run_gun bababa;banana bobama,meor; +banana;her:mer? mer! +eat grass cowb +monker@chvonker.sru diff --git a/lesson_5/hometask/task_2.py b/lesson_5/hometask/task_2.py new file mode 100644 index 0000000..c2badfb --- /dev/null +++ b/lesson_5/hometask/task_2.py @@ -0,0 +1,29 @@ +# Создать текстовый файл (не программно), сохранить в нем несколько строк, +# выполнить подсчет количества строк, количества слов в каждой строке. +import get_file_by_files_list as my_add_func + + +def designificate_string(origin: str) -> str: + """ + Функция заменяет "несловесные" символы из строки на пробелы + + :param origin: исходная строка с кучей символов + :return: строка с пробелами вместо "несловесных" символов + """ + bad_symbols_list = ('.', ',', '?', '!', ';', ':', '"', "'", '\\', '|', '/', '(', ')') + for bad_symbol in bad_symbols_list: + origin = origin.replace(bad_symbol, ' ') + return origin + + +count_lines = 0 +count_strings = [] +# Какой файл выбрать - решает пользователь +with open(my_add_func.get_file_by_current_folder(), "r") as reading_file: + for fileline in reading_file: + count_lines += 1 + count_strings.append(len(designificate_string(fileline).split())) + +print(f"Overall lines count is {count_lines}") +for current_count, current_word_number in enumerate(count_strings, 1): + print(f"{current_count} : word count is {current_word_number}") diff --git a/lesson_5/hometask/task_3.py b/lesson_5/hometask/task_3.py new file mode 100644 index 0000000..f53b180 --- /dev/null +++ b/lesson_5/hometask/task_3.py @@ -0,0 +1,27 @@ +# Создать текстовый файл (не программно), +# построчно записать фамилии сотрудников и величину их окладов (не менее 10 строк). +# Определить, кто из сотрудников имеет оклад менее 20 тыс., вывести фамилии этих сотрудников. +# Выполнить подсчет средней величины дохода сотрудников. +# **Пример файла:** +# +# Иванов 23543.12 +# Петров 13749.32 + +import get_file_by_files_list as my_add_func + +employee_salary_dict = {} + +with open(my_add_func.get_file_by_current_folder(), "r") as reading_file: + for fileline in reading_file: + try: + employee, salary, *_ = fileline.split() + employee_salary_dict[employee] = float(salary) + except ValueError: + print(f"uncorrect value catched: {employee} : {salary}") + exit() + +for employee, salary in employee_salary_dict.items(): + if salary < 20000.0: + print(f"{employee} has a salary {salary} which less than 20000") + +print(f"Average employees salary is {round(sum(employee_salary_dict.values()) / len(employee_salary_dict), 2)}") diff --git a/lesson_5/hometask/task_4.py b/lesson_5/hometask/task_4.py new file mode 100644 index 0000000..25e0d4f --- /dev/null +++ b/lesson_5/hometask/task_4.py @@ -0,0 +1,31 @@ +# Создать (не программно) текстовый файл со следующим содержимым: +# +# One — 1 +# Two — 2 +# Three — 3 +# Four — 4 +# +# Необходимо написать программу, открывающую файл на чтение и считывающую построчно данные. +# При этом английские числительные должны заменяться на русские. +# Новый блок строк должен записываться в новый текстовый файл. +import get_file_by_files_list as my_add_func + +numbers_dict = {} +russian_numbers_dict = {1: 'Один', 2: 'Два', 3: 'Три', 4: 'Четыре', 10: 'Десять'} +final_filename = 'new_numbers_file.txt' + +with open(my_add_func.get_file_by_current_folder(), "r") as reading_file: + for fileline in reading_file: + try: + string_number, _, number, *_ = fileline.split() + numbers_dict[int(number)] = string_number + except ValueError: + print(f"uncorrect value catched: {string_number} - {number}") + exit() + +with open(final_filename, 'w') as writing_file: + for number, string_number in numbers_dict.items(): + # Если не будет значения в словаре российских соответствий + # то лучше вставить английский вариант, чем ничего + print(f"{russian_numbers_dict.get(number, string_number)} — {number}", file=writing_file) +# writing_file.write(f"{russian_numbers_dict.get(number, string_number)} — {number}\n") diff --git a/lesson_5/hometask/task_5.py b/lesson_5/hometask/task_5.py new file mode 100644 index 0000000..ef9896f --- /dev/null +++ b/lesson_5/hometask/task_5.py @@ -0,0 +1,33 @@ +# Создать (программно) текстовый файл, записать в него программно набор чисел, +# разделенных пробелами. +# Программа должна подсчитывать сумму чисел в файле и выводить ее на экран. +import get_file_by_files_list as my_add_func + +# Создаём файл, заполняем, потом парсим его и выводим сумму чисел + +str_number_list = [] +final_numeric_file_name = 'numeric_file.txt' + +for element in input("Введите набор чисел через пробелы >>>").split(): + # нужны только числа + try: + str_number_list.append(str(my_add_func.get_number_by_string(element))) + except ValueError: + continue + +# Запишем цифры в файл +with open(final_numeric_file_name, 'w') as num_file: + num_file.write(' '.join(str_number_list)) + print(f"numbers writes to file {num_file.name}") + +# Посчитаем сумму цифр +with open(my_add_func.get_file_by_current_folder(), "r") as reading_file: + numbers_sum = 0 + for line in reading_file: + for element in line.split(): + # суммируются элементы, которые приводятся к числу + try: + numbers_sum += my_add_func.get_number_by_string(element) + except ValueError: + continue + print(f"Sum of numbers in file {reading_file.name} is {numbers_sum}") \ No newline at end of file diff --git a/lesson_5/hometask/task_6.py b/lesson_5/hometask/task_6.py new file mode 100644 index 0000000..689d2b5 --- /dev/null +++ b/lesson_5/hometask/task_6.py @@ -0,0 +1,29 @@ +# Необходимо создать (не программно) текстовый файл, +# где каждая строка описывает учебный предмет и наличие +# лекционных, практических и лабораторных занятий по этому предмету и их количество. +# Важно, чтобы для каждого предмета не обязательно были все типы занятий. +# Сформировать словарь, содержащий название предмета и общее количество занятий по нему. +# Вывести словарь на экран. +# +# **Примеры строк файла:** +# Информатика: 100(л) 50(пр) 20(лаб). +# Физика: 30(л) — 10(лаб) +# Физкультура: — 30(пр) — +# **Пример словаря:** +# {“Информатика”: 170, “Физика”: 40, “Физкультура”: 30} +import get_file_by_files_list as my_add_func +import re + +science_dict = dict() + +# ошибки здесь не обрабатываю. Введено не то - ну что ж +with open(my_add_func.get_file_by_current_folder(), "r") as reading_file: + for line in reading_file: + science_name, others = line.split(":") + # только цифры + num_sum = 0 + # воспользуемся регулярными выражениями. Нужны только цифры + for num in ' '.join(re.split('[^\d]', others)).split(): + num_sum += my_add_func.get_number_by_string(num) + science_dict[science_name] = num_sum +print(f"Final dict is {science_dict}") diff --git a/lesson_5/hometask/task_7.py b/lesson_5/hometask/task_7.py new file mode 100644 index 0000000..f68c7a4 --- /dev/null +++ b/lesson_5/hometask/task_7.py @@ -0,0 +1,71 @@ +# Cоздать вручную и заполнить несколькими строками текстовый файл, +# в котором каждая строка должна содержать данные о фирме: +# название, форма собственности, выручка, издержки. +# +# **Пример строки файла:**firm_1 ООО 10000 5000. +# +# Необходимо построчно прочитать файл, вычислить прибыль каждой компании, +# а также среднюю прибыль. Если фирма получила убытки, в расчет средней прибыли ее не включать. +# +# Далее реализовать список. Он должен содержать словарь с фирмами и их прибылями, +# а также словарь со средней прибылью. Если фирма получила убытки, +# также добавить ее в словарь (со значением убытков). +# +# **Пример списка:**[{“firm_1”: 5000, “firm_2”: 3000, “firm_3”: 1000}, {“average_profit”: 2000}]. +# +# Итоговый список сохранить в виде json-объекта в соответствующий файл. +# +# **Пример json-объекта:** +# ` [{"firm_1": 5000, "firm_2": 3000, "firm_3": 1000}, {"average_profit": 2000}] ` +# +# **Подсказка:**использовать менеджер контекста. + +import json +import get_file_by_files_list as my_add_func + +# заготовка списка словарей с информацией о прибыльности фирм и средней прибыльности +# убытки в словарь средней прибыли не войдут +firm_list = [{}, {"average_profit": 0}] +firms_dict = firm_list[0] +firms_common_dict = firm_list[1] + + +def calculate_recurrent_average(new_value: float, avg: float, count: int) -> float: + """ + Расчёт среднего значения по рекуррентной формуле + avg_n = (avg_n-1 *(n-1) + an)/n + + :param new_value: новое значение, an + :param avg: среднее значение на предыдущей итерации, avg_n-1 + :param count: номер итерации, n + :return: среднее на текущей итерации + """ + if count <= 0: + raise ValueError("Iteration count must be a positive!") + return (avg * (count - 1) + new_value) / count + + +with open(my_add_func.get_file_by_current_folder(), "r") as reading_file: + profitible_count = 0 + for line in reading_file: + try: + *firm_name_array, company_form, revenue, costs = line.split() + revenue = my_add_func.get_number_by_string(revenue) + costs = my_add_func.get_number_by_string(costs) + except ValueError: + print(f"Unable to parse line {line}") + continue + firm_name = ' '.join(firm_name_array) + profitable = revenue - costs + firms_dict[firm_name] = profitable + if profitable < 0: + continue + profitible_count += 1 + firms_common_dict["average_profit"] = \ + calculate_recurrent_average(profitable, + firms_common_dict.get("average_profit", 0), + profitible_count) +print(firm_list) + +with open("company_dictlist.json", 'w') as json_file: + json.dump(firm_list, json_file)