Commit 017b3c95 by Patryk Czarnik

wersja dataclass

parent ca359d05
# @dataclass automatycznie generuje metody init, repr, str i eq
# które działają we właściwy sposób dla rekordów z polami takimi, jak wymienione w klasie
# od Pythona 3.7
from dataclasses import dataclass
@dataclass
class Employee:
employee_id:int
first_name:str
last_name:str
job_title:str
salary:int
hire_date:str
department_name:str
address:str
postal_code:str
city:str
country:str
nazwy_kolumn = ('employee_id', 'first_name', 'last_name', 'job_title', 'salary', 'hire_date',
'department_name', 'address', 'postal_code', 'city', 'country')
SEP = ';'
@property
def wszystkie_pola(self):
# pobranie wartości wszystkich atrybutów obiektu w takiej kolejności, jak wpisane w init
return self.__dict__.values()
# gdybyśmy mieli wątpliwości co do olejności kolumn, to można też tak:
# return [self.__dict__[kolumna] for kolumna in Employee.nazwy_kolumn]
def zmien_pensje(self, zmiana):
self.salary += zmiana
@staticmethod
def read_csv(sciezka):
lista = []
with open(sciezka, mode='r', encoding='utf-8') as plik:
plik.readline()
for linia in plik:
t = linia.strip().split(Employee.SEP)
emp = Employee(int(t[0]), t[1], t[2], t[3], int(t[4]), *t[5:])
lista.append(emp)
return lista
@staticmethod
def write_csv(emps, sciezka):
with open(sciezka, mode='w', encoding='utf-8') as plik:
print(*Employee.nazwy_kolumn, sep=Employee.SEP, file=plik)
for emp in emps:
print(*emp.wszystkie_pola, sep=Employee.SEP, file=plik)
from employees import Employee
emps = Employee.read_csv('emps.csv')
print('Liczba odczytanych rekordów:', len(emps))
for emp in emps:
print(emp)
from employees import Employee
emps = Employee.read_csv('emps.csv')
suma = 0
for emp in emps:
suma += emp.salary
srednia = suma / len(emps)
print('Średnia wszystkich:', srednia)
from employees import Employee
emps = Employee.read_csv('emps.csv')
jaki_job = input('Podaj nazwę stanowiska, np. Programmer: ')
ile = 0
suma = 0
for emp in emps:
if emp.job_title == jaki_job:
suma += emp.salary
ile += 1
if ile > 0:
srednia = suma / ile
print(f'Średnia pensja {ile} pracowników na stanowisku {jaki_job} wynosi: {srednia:.2f}')
else:
print(f'Nikt nie pracuje na stanowisku {jaki_job}')
from employees import Employee
emps = Employee.read_csv('emps.csv')
slownik = {}
# W słowniku kluczem jest job, a wartością jest dwuelementowa lista: [count, sum]
for emp in emps:
if emp.job_title in slownik:
slownik[emp.job_title][0] += 1
slownik[emp.job_title][1] += emp.salary
else:
slownik[emp.job_title] = [1, emp.salary]
print(slownik)
print()
# dwupoziomowe rozpakowanie - dane lądują od razu w zmiennych
for job, (ilosc, suma) in slownik.items():
srednia = suma / ilosc
print(f'| {job:32} | {ilosc:2} | {srednia:8.2f} |')
from employees import Employee
emps = Employee.read_csv('emps.csv')
job = input('Podaj nazwę stanowiska: ')
podwyzka = int(input('Podaj kwotę podwyżki: '))
for emp in emps:
if emp.job_title == job:
emp.salary += podwyzka
Employee.write_csv(emps, 'zmienione.csv')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment