Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сommit for lesson05 #5

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions files/file.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Создать текстовый файл (не программно),
сохранить в нём несколько строк,
выполнить подсчёт строк и слов в каждой строке.
10 changes: 10 additions & 0 deletions files/firms.txt
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions files/numbers.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
One — 1
Two — 2
Three — 3
Four — 4
10 changes: 10 additions & 0 deletions files/salary.txt
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions files/subjects.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Информатика: 100(л) 50(пр) 20(лаб)
Физика: 30(л) - 10(лаб)
Физкультура: - 30(пр) -
Пение: 2(л) 20(пр) -
Литература: 40(л) - -
Русский язык: 120(л) 100(пр) -
Английский язык: 120(л) 120(пр) -
История: 50(л) - -
Математика: 150(л) 150(пр) 30(лаб)
Искусственный интеллект: 100(л) 100(пр) 100(лаб)
231 changes: 231 additions & 0 deletions lesson05.py
Original file line number Diff line number Diff line change
@@ -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}")