Python3 中级练习:简易库存管理系统
使用Python实现一个简易库存管理系统。这个项目涵盖了文件操作、数据持久化、类设计、异常处理等
import json
import os
from datetime import datetimeclass InventoryItem:def __init__(self, name, category, price, quantity, sku=None):self.name = nameself.category = categoryself.price = float(price)self.quantity = int(quantity)self.sku = sku or self._generate_sku()self.last_updated = datetime.now().strftime("%Y-%m-%d %H:%M:%S")def _generate_sku(self):"""生成简单的SKU"""initials = ''.join([word[0].upper() for word in self.name.split()])timestamp = datetime.now().strftime("%m%d%H%M")return f"{initials}-{timestamp}"def to_dict(self):"""将对象转换为字典"""return {'name': self.name,'category': self.category,'price': self.price,'quantity': self.quantity,'sku': self.sku,'last_updated': self.last_updated}class InventorySystem:def __init__(self, filename='inventory.json'):self.filename = filenameself.inventory = self._load_inventory()def _load_inventory(self):"""从文件加载库存数据"""if os.path.exists(self.filename):try:with open(self.filename, 'r') as f:return json.load(f)except Exception as e:print(f"加载库存失败: {e}")return []return []def _save_inventory(self):"""保存库存数据到文件"""try:with open(self.filename, 'w') as f:json.dump(self.inventory, f, indent=2)return Trueexcept Exception as e:print(f"保存库存失败: {e}")return Falsedef add_item(self, item):"""添加新商品到库存"""# 检查是否已存在相同SKU的商品if any(i['sku'] == item.sku for i in self.inventory):print(f"SKU {item.sku} 已存在,无法添加重复商品")return Falseself.inventory.append(item.to_dict())if self._save_inventory():print(f"成功添加商品: {item.name} (SKU: {item.sku})")return Truereturn Falsedef update_item(self, sku, quantity_change=None, new_price=None):"""更新商品库存或价格"""for item in self.inventory:if item['sku'] == sku:if quantity_change is not None:item['quantity'] += quantity_changeprint(f"更新库存: {item['name']} 数量变更: {quantity_change}")if new_price is not None:item['price'] = new_priceprint(f"更新价格: {item['name']} 新价格: ¥{new_price:.2f}")item['last_updated'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")self._save_inventory()return Trueprint(f"未找到 SKU: {sku} 的商品")return Falsedef remove_item(self, sku):"""从库存中移除商品"""for i, item in enumerate(self.inventory):if item['sku'] == sku:removed = self.inventory.pop(i)self._save_inventory()print(f"已移除商品: {removed['name']} (SKU: {removed['sku']})")return Trueprint(f"未找到 SKU: {sku} 的商品")return Falsedef search_items(self, query):"""搜索商品(按名称或SKU)"""results = []query = query.lower()for item in self.inventory:if query in item['name'].lower() or query == item['sku'].lower():results.append(item)return resultsdef get_low_stock_items(self, threshold=5):"""获取库存低于阈值的商品"""return [item for item in self.inventory if item['quantity'] < threshold]def get_inventory_value(self):"""计算库存总价值"""return sum(item['price'] * item['quantity'] for item in self.inventory)def display_inventory(self, items=None):"""显示库存列表"""inventory = items or self.inventoryif not inventory:print("库存为空")returnprint("\n{:<10} {:<15} {:<10} {:<8} {:<10} {:<15}".format("SKU", "商品名称", "分类", "价格", "数量", "最后更新"))print("-" * 70)for item in inventory:print("{:<10} {:<15} {:<10} ¥{:<7.2f} {:<10} {:<15}".format(item['sku'], item['name'], item['category'], item['price'], item['quantity'], item['last_updated']))print(f"\n总计: {len(inventory)} 种商品")def main():inventory = InventorySystem()while True:print("\n===== 库存管理系统 =====")print("1. 添加新商品")print("2. 更新库存")print("3. 移除商品")print("4. 查看所有商品")print("5. 搜索商品")print("6. 查看低库存商品")print("7. 计算库存总值")print("0. 退出系统")try:choice = input("请选择操作: ")if choice == '0':print("感谢使用库存管理系统,再见!")breakelif choice == '1': # 添加商品print("\n添加新商品")name = input("商品名称: ")category = input("商品分类: ")price = float(input("单价: "))quantity = int(input("数量: "))new_item = InventoryItem(name, category, price, quantity)inventory.add_item(new_item)elif choice == '2': # 更新库存sku = input("请输入要更新的商品SKU: ")print("\n1. 更新库存数量")print("2. 更新商品价格")sub_choice = input("请选择更新类型: ")if sub_choice == '1':change = int(input("输入库存变化量(+增加/-减少): "))inventory.update_item(sku, quantity_change=change)elif sub_choice == '2':new_price = float(input("输入新价格: "))inventory.update_item(sku, new_price=new_price)else:print("无效选择")elif choice == '3': # 移除商品sku = input("请输入要移除的商品SKU: ")inventory.remove_item(sku)elif choice == '4': # 查看所有商品inventory.display_inventory()elif choice == '5': # 搜索商品query = input("请输入商品名称或SKU进行搜索: ")results = inventory.search_items(query)inventory.display_inventory(results)elif choice == '6': # 查看低库存商品threshold = input("输入库存阈值(默认5): ")try:threshold = int(threshold) if threshold else 5except ValueError:threshold = 5low_stock = inventory.get_low_stock_items(threshold)if low_stock:print(f"\n库存低于 {threshold} 的商品:")inventory.display_inventory(low_stock)else:print(f"没有库存低于 {threshold} 的商品")elif choice == '7': # 计算库存总值total_value = inventory.get_inventory_value()print(f"\n库存总价值: ¥{total_value:.2f}")else:print("无效选择,请重新输入")except ValueError:print("输入格式错误,请确保输入正确的数字或价格")except Exception as e:print(f"发生错误: {e}")if __name__ == "__main__":main()
关键知识点解析
面向对象编程
InventoryItem
类封装商品属性和行为InventorySystem
类管理整个库存系统
数据持久化
- 使用JSON格式存储库存数据
_load_inventory()
和_save_inventory()
方法处理文件读写
SKU生成算法
- 自动生成基于名称和时间戳的唯一SKU
- 确保商品的唯一标识
库存管理功能
- 添加/更新/删除商品
- 搜索功能(按名称或SKU)
- 低库存预警
- 库存总值计算
错误处理
- 使用try-except捕获输入错误
- 处理文件操作异常
- 验证输入有效性
用户界面
- 命令行菜单系统
- 格式化的数据展示
运行示例
===== 库存管理系统 =====
1. 添加新商品
2. 更新库存
3. 移除商品
4. 查看所有商品
5. 搜索商品
6. 查看低库存商品
7. 计算库存总值
0. 退出系统
请选择操作: 1添加新商品
商品名称: iPhone 13
商品分类: 手机
单价: 5999
数量: 20
成功添加商品: iPhone 13 (SKU: I-08222345)===== 库存管理系统 =====
请选择操作: 4SKU 商品名称 分类 价格 数量 最后更新
----------------------------------------------------------------------
I-08222345 iPhone 13 手机 ¥5999.00 20 2023-08-22 23:45:30总计: 1 种商品
扩展练习建议
添加分类管理功能
- 实现商品分类的增删改查
- 按分类查看库存
实现销售功能
- 添加购物车系统
- 处理销售订单
- 更新库存
添加用户权限
- 区分管理员和普通用户
- 实现登录系统
数据统计与分析
- 销售统计报表
- 库存周转率计算
- 可视化展示
使用数据库
- 将JSON替换为SQLite数据库
- 实现更复杂的数据查询