From 9fa4c2044ff9ab5007244d32dc5c558f941db129 Mon Sep 17 00:00:00 2001 From: Denis Bogdanovskiy Date: Wed, 2 Feb 2022 19:08:15 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A1ommit=20for=20lesson05?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/file.txt | 3 + files/firms.txt | 10 ++ files/numbers.txt | 4 + files/salary.txt | 10 ++ files/subjects.txt | 10 ++ lesson05.py | 231 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 268 insertions(+) create mode 100644 files/file.txt create mode 100644 files/firms.txt create mode 100644 files/numbers.txt create mode 100644 files/salary.txt create mode 100644 files/subjects.txt create mode 100644 lesson05.py diff --git a/files/file.txt b/files/file.txt new file mode 100644 index 0000000..c524ea2 --- /dev/null +++ b/files/file.txt @@ -0,0 +1,3 @@ +Создать текстовый файл (не программно), +сохранить в нём несколько строк, +выполнить подсчёт строк и слов в каждой строке. \ No newline at end of file diff --git a/files/firms.txt b/files/firms.txt new file mode 100644 index 0000000..30d40c1 --- /dev/null +++ b/files/firms.txt @@ -0,0 +1,10 @@ +firm_1 ООО 10000 15000 +firm_2 ОАО 250000 55000 +firm_3 ООО 113000 45000 +firm_4 ООО 122000 9000 +firm_5 ОАО 4230000 310000 +firm_6 ООО 40000 51000 +firm_7 ООО 550000 134000 +firm_8 ЗАО 32000 2000 +firm_9 ЗАО 31000 17000 +firm_10 ООО 130000 17000 diff --git a/files/numbers.txt b/files/numbers.txt new file mode 100644 index 0000000..a13d26b --- /dev/null +++ b/files/numbers.txt @@ -0,0 +1,4 @@ +One — 1 +Two — 2 +Three — 3 +Four — 4 diff --git a/files/salary.txt b/files/salary.txt new file mode 100644 index 0000000..ce5bc8b --- /dev/null +++ b/files/salary.txt @@ -0,0 +1,10 @@ +John Doe;20000 +Mary Scott;3000 +Teodor Manson;40000 +King Man;30000 +Petrov Petr;100000 +Ivanov Ivan;23000 +Kornelius Montenegro;3200 +Pedro Ganzales;2000 +Ted Manson;31000 +Vincent Polo;43000 \ No newline at end of file diff --git a/files/subjects.txt b/files/subjects.txt new file mode 100644 index 0000000..9da4a46 --- /dev/null +++ b/files/subjects.txt @@ -0,0 +1,10 @@ +Информатика: 100(л) 50(пр) 20(лаб) +Физика: 30(л) - 10(лаб) +Физкультура: - 30(пр) - +Пение: 2(л) 20(пр) - +Литература: 40(л) - - +Русский язык: 120(л) 100(пр) - +Английский язык: 120(л) 120(пр) - +История: 50(л) - - +Математика: 150(л) 150(пр) 30(лаб) +Искусственный интеллект: 100(л) 100(пр) 100(лаб) diff --git a/lesson05.py b/lesson05.py new file mode 100644 index 0000000..337f631 --- /dev/null +++ b/lesson05.py @@ -0,0 +1,231 @@ +from random import randint +import json + +# 1. Создать программный файл в текстовом формате, записать в него построчно данные, вводимые пользователем. +# Об окончании ввода данных будет свидетельствовать пустая строка. +print("==================== 1 ====================") +with open('files/file01.txt', 'w+') as f: + while True: + try: + strdt = input('Введите текст строки (Enter - завершить запись в файл): ') + if strdt == "": + break + else: + f.write(strdt+"\n") + except Exception as e: + print('Вы ввели неверное значение! Введенный Вами список содержит некорректные данные! Попробуйте снова.') + # print(e) + print("Содержание файла:") + f.seek(0) + print(f.read()) + # for ln in f.readlines(): + # print(ln, end="") + +# 2. Создать текстовый файл (не программно), сохранить в нём несколько строк, +# выполнить подсчёт строк и слов в каждой строке. +print("==================== 2 ====================") +with open('files/file.txt', 'r') as f: + lns = f.readlines() + print(f"Количество строк = {len(lns)}") + n = 0 + for ln in lns: + n += 1 + print(f"Строка № {n}; количество слов: {len(ln.split())}; текст: {ln}", end="") + print("") + +print("=== Read file with generator ===") +with open('files/file.txt', 'r') as f: + lns = ((line, len(line.split())) for line in f) + n = 0 + for ln in lns: + n += 1 + print(f"Строка № {n}; количество слов: {ln[1]}; текст: {ln[0]}", end="") + print("") + print(f"Количество строк = {n}") + print("") + +# 3. Создать текстовый файл (не программно). +# Построчно записать фамилии сотрудников и величину их окладов (не менее 10 строк). +# Определить, кто из сотрудников имеет оклад менее 20 тысяч, вывести фамилии этих сотрудников. +# Выполнить подсчёт средней величины дохода сотрудников. +# Пример файла: +# Иванов 23543.12 +# Петров 13749.32 +print("") +print("==================== 3 ====================") +with open('files/salary.txt', 'r') as f: + lines = f.readlines() + staff_count = len(lines) + staff_salary = len(lines) + print(f"Всего сотрудников: {staff_count}") + print(f"Сотрудники у которых зп ниже 20 000.00:") + print(f"{'ФИО':40} | Сумма") + print(f"-----------------------------------------|----------") + for line in lines: + line_info = line.split(';') + fio = line_info[0] + sal = float(line_info[1]) + staff_salary += sal + if sal < 20000.00: + print(f"{fio:40} | {sal:7.2f}") + print(f"Средняя зп в коллективе: {staff_salary:7.2f} / {staff_count:2} = {staff_salary/staff_count:7.2f}") + +# 4. Создать (не программно) текстовый файл со следующим содержимым: +# One — 1 +# Two — 2 +# Three — 3 +# Four — 4 +# Напишите программу, открывающую файл на чтение и считывающую построчно данные. +# При этом английские числительные должны заменяться на русские. +# Новый блок строк должен записываться в новый текстовый файл. +print("") +print("==================== 4 ====================") +newline = '\n' +lng_ru = ("Ноль", "Один", "Два", "Три", "Четыре", "Пять", "Шесть", "Семь", "Восемь", "Девять", "Десять") +with open('files/numbers.txt', 'r') as f, open('files/numbers_ru.txt', 'w') as f1: + try: + for line in f: + l = int(line.split(" — ")[1]) + f1.write(f"{lng_ru[l]} — {l}\n") + print(f"{(line.replace(newline, ''))} => {lng_ru[l]} — {l}") + except IOError as e: + print("Конец файла.") + except Exception as e: + print(f"При чтении/записи файлов произошла ошибка: {e}") + +# 5. Создать (программно) текстовый файл, записать в него программно набор чисел, разделённых пробелами. +# Программа должна подсчитывать сумму чисел в файле и выводить её на экран. +print("") +print("==================== 5 ====================") +c = 10 +min_digit = 1 +max_digit = 100 +with open('files/file05.txt', 'w+') as f: + for n in range(0, c+1): + if n > 0: + f.write(" ") + f.write(f"{randint(min_digit, max_digit+1)}") + f.seek(0) + nms = f.readline().split() + s = 0 + print("Числа в файле: ", end="") + for n in nms: + if s > 0: + print(", ", end="") + print(n, end="") + s += int(n) + print("") + print(f"Общая сумма чисел: {s}") + +# 6. Сформировать (не программно) текстовый файл. +# В нём каждая строка должна описывать учебный предмет и наличие лекционных, +# практических и лабораторных занятий по предмету. Сюда должно входить и количество занятий. +# Необязательно, чтобы для каждого предмета были все типы занятий. +# Сформировать словарь, содержащий название предмета и общее количество занятий по нему. Вывести его на экран. +# Примеры строк файла: Информатика: 100(л) 50(пр) 20(лаб). +# Физика: 30(л) — 10(лаб) +# Физкультура: — 30(пр) — +# Пример словаря: {“Информатика”: 170, “Физика”: 40, “Физкультура”: 30} +print("") +print("==================== 6 ====================") +res = {} +with open('files/subjects.txt', 'r') as f: + try: + print("Нагрузка по предметам:") + for line in f: + sbj = line.split(": ") + hr = sbj[1].split() + hr_sum = 0 + hrs = [] + for h in hr: + h_ = h.split("(")[0] + hrs.append(h_) + if h_ != "-": + h_ = int(h_) + hr_sum += h_ + res[sbj[0]] = hr_sum + print(f"{sbj[0]:20}: лекции = {hrs[0].replace('-', '- '):>3}; практические занятия = {hrs[1].replace('-', '- '):>3}; лабораторные работы = {hrs[2].replace('-', '- '):>3}.") + print("") + print(f"Общая нагрузка по предметам: {res}") + print(f"Общая нагрузка по предметам:") + for sb in res: + print(f"{sb:30}: {res[sb]:>3};") + except IOError as e: + print("Конец файла.") + except Exception as e: + print(f"При чтении/записи файлов произошла ошибка: {e}") + +# 7. Создать вручную и заполнить несколькими строками текстовый файл, +# в котором каждая строка будет содержать данные о фирме: название, форма собственности, выручка, издержки. +# Пример строки файла: 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}] +# Подсказка: использовать менеджер контекста. +print("") +print("==================== 7 ====================") +print("") +res = [{}, {}] +with open('files/firms.txt', 'r') as f: + try: + sum_profit = 0 + cnt_profit = 0 + print(f" {'Данные по организациям':^71} ") + print(f" {'='*71} ") + print(f"| {'Наименование':^20} | {'Форма собственности':^20} | {'Выручка':^10} | {'Издержки':^10} |") + print(f"|{'':->22}|{'':->22}|{'':->12}|{'':->12}|") + for line in f: + frm = line.split(" ") + sm = float(frm[2]) - float(frm[3]) + if sm > 0: + sum_profit += sm + cnt_profit += 1 + res[0][frm[0]] = sm + print(f"| {frm[0]:<20} | {frm[1]:<20} | {frm[2]:>10.2} | {frm[3]:>10.2} |") + print(f" {'='*71} ") + print("") + print(f"Аналитический отчет по организациям: {res}") + res[1]["average_profit"] = sum_profit / cnt_profit + with open('files/firms.json', 'w+') as fw: + json.dump(res, fw) + print(f"Общая нагрузка по предметам (JSON):", end="") + fw.seek(0) + print(fw.read()) + print("") + print(f" {'Доходы организации':^40} ") + print(f" {'=' * 40} ") + print(f"| {'Наименование':^20} | {'Доход':^15} |") + print(f"|{'':->22}|{'':->17}|") + for i in res[0]: + print(f"| {i:<20} | {res[0][i]:15.2f} |") + print(f"|{'-' * 40}|") + print(f"|{'Средняя прибыль: ':<25}{res[1]['average_profit']:15.2f}|") + print(f" {'=' * 40} ") + + + except IOError as e: + print("Конец файла.") + except Exception as e: + print(f"При чтении/записи файлов произошла ошибка: {e}") + + + + + + + + + + + + + + + +