235 lines
6.2 KiB
Python
235 lines
6.2 KiB
Python
# Практическая работа
|
||
# Тема: Обработка данных интернет-магазина
|
||
|
||
|
||
def load_products_from_file(filepath):
|
||
products = []
|
||
|
||
try:
|
||
file = open(filepath, "r", encoding="utf-8")
|
||
|
||
for line in file:
|
||
line = line.strip()
|
||
|
||
if line == "":
|
||
continue
|
||
|
||
parts = line.split(";")
|
||
|
||
if len(parts) != 6:
|
||
continue
|
||
|
||
try:
|
||
product = {
|
||
"id": int(parts[0]),
|
||
"name": parts[1],
|
||
"category": parts[2],
|
||
"price": float(parts[3]),
|
||
"quantity": int(parts[4]),
|
||
"description": parts[5]
|
||
}
|
||
products.append(product)
|
||
except:
|
||
continue
|
||
|
||
file.close()
|
||
|
||
except FileNotFoundError:
|
||
print("Файл не найден")
|
||
except:
|
||
print("Ошибка при чтении файла")
|
||
|
||
return products
|
||
|
||
|
||
def validate_product(product):
|
||
if "id" not in product:
|
||
return False
|
||
if "name" not in product:
|
||
return False
|
||
if "category" not in product:
|
||
return False
|
||
if "price" not in product:
|
||
return False
|
||
if "quantity" not in product:
|
||
return False
|
||
if "description" not in product:
|
||
return False
|
||
|
||
if product["name"].strip() == "":
|
||
return False
|
||
if product["category"].strip() == "":
|
||
return False
|
||
if product["price"] < 0:
|
||
return False
|
||
if product["quantity"] < 0:
|
||
return False
|
||
|
||
return True
|
||
|
||
|
||
def filter_products_by_category(products, category):
|
||
result = []
|
||
|
||
for product in products:
|
||
if product["category"].lower() == category.lower():
|
||
result.append(product)
|
||
|
||
return result
|
||
|
||
|
||
def search_products_by_keyword(products, keyword):
|
||
result = []
|
||
|
||
for product in products:
|
||
text = product["name"] + " " + product["description"]
|
||
|
||
if keyword.lower() in text.lower():
|
||
result.append(product)
|
||
|
||
return result
|
||
|
||
|
||
def sort_products_by_price(products, descending=False):
|
||
return sorted(products, key=lambda x: x["price"], reverse=descending)
|
||
|
||
|
||
def calculate_discounted_price(price, discount_percent):
|
||
new_price = price - price * discount_percent / 100
|
||
return round(new_price, 2)
|
||
|
||
|
||
def build_cart(products, product_ids):
|
||
cart = []
|
||
|
||
for product_id in product_ids:
|
||
for product in products:
|
||
if product["id"] == product_id:
|
||
cart.append(product)
|
||
break
|
||
|
||
return cart
|
||
|
||
|
||
def calculate_cart_total(cart, discounts=None):
|
||
total = 0
|
||
|
||
for product in cart:
|
||
current_price = product["price"]
|
||
|
||
if discounts is not None:
|
||
if product["id"] in discounts:
|
||
current_price = calculate_discounted_price(current_price, discounts[product["id"]])
|
||
elif product["category"] in discounts:
|
||
current_price = calculate_discounted_price(current_price, discounts[product["category"]])
|
||
|
||
total += current_price
|
||
|
||
return round(total, 2)
|
||
|
||
|
||
def group_products_by_category(products):
|
||
groups = {}
|
||
|
||
for product in products:
|
||
category = product["category"]
|
||
|
||
if category not in groups:
|
||
groups[category] = []
|
||
|
||
groups[category].append(product)
|
||
|
||
return groups
|
||
|
||
|
||
def generate_order_report(cart, total_cost):
|
||
report = "Отчет по заказу\n"
|
||
report += "-------------------------\n"
|
||
|
||
number = 1
|
||
for product in cart:
|
||
report += str(number) + ". " + product["name"] + " - " + str(product["price"]) + " руб.\n"
|
||
number += 1
|
||
|
||
report += "-------------------------\n"
|
||
report += "Количество товаров: " + str(len(cart)) + "\n"
|
||
report += "Итоговая стоимость: " + str(total_cost) + " руб.\n"
|
||
|
||
return report
|
||
|
||
|
||
def main():
|
||
products = load_products_from_file("data.txt")
|
||
|
||
print("Загруженные товары:")
|
||
for product in products:
|
||
print(product)
|
||
|
||
valid_products = []
|
||
invalid_products = []
|
||
|
||
for product in products:
|
||
if validate_product(product):
|
||
valid_products.append(product)
|
||
else:
|
||
invalid_products.append(product)
|
||
|
||
print()
|
||
print("Корректных товаров:", len(valid_products))
|
||
print("Некорректных товаров:", len(invalid_products))
|
||
|
||
filtered_products = filter_products_by_category(valid_products, "Электроника")
|
||
print()
|
||
print("Товары категории Электроника:")
|
||
for product in filtered_products:
|
||
print(product["name"], "-", product["price"], "руб.")
|
||
|
||
found_products = search_products_by_keyword(valid_products, "игровой")
|
||
print()
|
||
print("Поиск по слову 'игровой':")
|
||
for product in found_products:
|
||
print(product["name"], "-", product["description"])
|
||
|
||
sorted_products = sort_products_by_price(found_products)
|
||
print()
|
||
print("После сортировки по цене:")
|
||
for product in sorted_products:
|
||
print(product["name"], "-", product["price"], "руб.")
|
||
|
||
if len(valid_products) > 0:
|
||
old_price = valid_products[0]["price"]
|
||
new_price = calculate_discounted_price(old_price, 10)
|
||
|
||
print()
|
||
print("Пример расчета скидки:")
|
||
print("Старая цена:", old_price)
|
||
print("Новая цена:", new_price)
|
||
|
||
cart = build_cart(valid_products, [1, 3, 5])
|
||
print()
|
||
print("Корзина:")
|
||
for product in cart:
|
||
print(product["name"], "-", product["price"], "руб.")
|
||
|
||
discounts = {
|
||
1: 10,
|
||
"Электроника": 5
|
||
}
|
||
|
||
total_cost = calculate_cart_total(cart, discounts)
|
||
print()
|
||
print("Итоговая стоимость корзины:", total_cost, "руб.")
|
||
|
||
groups = group_products_by_category(valid_products)
|
||
print()
|
||
print("Группировка товаров по категориям:")
|
||
for category in groups:
|
||
print(category, "-", len(groups[category]), "товаров")
|
||
|
||
report = generate_order_report(cart, total_cost)
|
||
print()
|
||
print(report)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |