【Python自动化】安全库存阈值不同?库管/小白1个脚本预警

为什么你需要这个脚本

管多品类库存有多痛苦?

在仓库、仓库管理系统中管理货品时,出现令库管烦恼的问题是:把所有货品的安全库存阈值(即剩下多少件就预警且提示该补货/进货)设为统一标准,导致销量快的货总是缺货、销量慢的货总是积压,这样既降低了仓库空间流转、又出现资金的配置严重失衡。因为每个货品的销量不同,安全库存阈值就不同。

这个脚本能帮你做什么

这怎么办呢?没事,有Python多货品安全库存预警系统解决。库管输入每个货品的商品名、商品当前库存、商品安全库存阈值,就能自动提示该货品是否进货/补货了。Python多货品安全库存预警系统能解决因为库管把所有货品安全库存阈值设置为统一的值导致的上述的后果。
对于Python小白来说,Python多货品安全库存预警系统运用Python函数的默认参数的语法知识,可以通过它来达到熟练掌握、灵活运用Python函数的默认参数的目的。

多货品安全库存预警脚本源码

运行结果

运行Python多货品安全库存预警系统时,通过输入商品名、商品当前库存、商品安全库存阈值,给出是否需要补货/进货的预警。
我在雪糕仓库工作,有一定的相关工作经验。我通过运行Python多货品安全库存预警系统,给雪糕做库存预警。

更新多货品安全库存预警表.xlsx

在下面几幅图中,在多货品安全库存预警表.xlsx在的情况下,会更新该.xlsx表,里面增加新输入的商品信息、更新改动的商品信息,没有改动的商品信息不变。
同时展示输入商品名、商品当前库存、商品安全库存阈值的校验功能。
下面两幅图是运行前的图片,多商品安全库存预警表.xlsx在了。

运行前多货品安全库存预警表.xlsx的内容如下图所示。

下面几幅图是在运行的图片。


运行时更新的多货品安全库存预警表.xlsx的内容如下图所示。

创建多货品安全库存预警表.xlsx

以下几幅图中,在没有多货品安全库存预警表.xlsx的情况下,运行python多货品安全库存预警系统时会新创建一个多商品安全库存预警表.xlsx。
如下一幅图,这是在运行之前。没有多商品安全库存预警表.xlsx。

下面几幅图是在运行的图片。

在运行之后,已经创建了多货品安全库存预警表.xlsx。

创建好的多货品安全库存预警表.xlsx的内容如下图所示。

退出python多货品安全库存预警系统

如下几幅图展示的是python多货品安全库存预警系统的退出功能。





代码详解

Python多货品安全库存预警脚本的完整源码如下。
如果你们看不懂代码,那么没事,代码里带注释。
该脚本的代码的注释中,主要讲解了商品名称、商品当前库存、商品安全库存阈值的输入及其校验,比较商品当前库存和安全库存并给出是否需要补货/进货的预警,把结果保存在excel表中,还重点介绍了在哪里以及如何运用Python函数的默认参数的语法知识。如果你不懂Python函数的默认参数的语法知识,请阅读下面一篇文章。
Python函数默认参数错?PyCharm中新手1招根治
这些能保证库管和Python新手能看懂。

importopenpyxlfromopenpyxl.stylesimportFont,PatternFill,Alignmentimportos# ============================================# 全局配置:Excel文件名# ============================================EXCEL_FILE="多商品安全库存预警表.xlsx"# ============================================# 功能一:库存预警判断# ============================================## 【Python 默认参数 知识点】## 写法:def 函数名(参数1, 参数2, 参数3=默认值):## 规则:# · 参数1、参数2 是"必填参数",调用时必须给值,不给就报错# · 参数3=默认值 是"默认参数",调用时可给可不给# - 给了 → 用你给的值# - 没给 → 自动用等号后面的默认值## 本例:warn_threshold=15# · 大多数商品安全库存都是15,不用每次写# · 少数特殊商品(比如贵重品)可以自定义,如传20## 三种合法调用方式:# stock_warning(8, "苹果") → 用默认值15# stock_warning(8, "苹果", 20) → 用自定义值20# stock_warning(8, "苹果", warn_threshold=25) → 带名字传,更清晰# ============================================defstock_warning(stock_num,sku,warn_threshold=15):"""判断库存是否需要补货,返回是或否"""ifstock_num<warn_threshold:# 当前库存 < 安全阈值?print(f"🔴{sku}库存{stock_num},低于阈值{warn_threshold},该补货了!")return"是"# 返回"是",表示需要补货else:print(f"🟢{sku}库存{stock_num},正常,无需补货。")return"否"# 返回"否",表示不需要补货# ============================================# 功能二:获取用户输入(带校验)# ============================================## 【又是默认参数】must_be_int=False## 作用:一个函数干两件事,靠默认参数区分# · 输入商品名时 → get_input("提示文字")# 只校验非空,因为商品名可以是汉字、字母# · 输入库存数量时 → get_input("提示文字", must_be_int=True)# 额外校验必须是整数,库存不能是小数或文字## 返回值:# · 正常输入 → 返回输入的内容# · 输入 q 或 Q → 返回 None,表示用户想退出# ============================================defget_input(prompt,must_be_int=False):"""获取用户输入,校验后返回。输入q/Q返回None表示退出"""whileTrue:# 无限循环,直到输入合法才跳出text=input(prompt).strip()# input()接收键盘输入,strip()去掉首尾空格iftext.lower()=="q":# .lower()把大写Q转成小写q,统一判断returnNone# 返回None,外层收到None就知道要退出iftext=="":# 输入全是空格或直接回车print("输入不能为空,请重新输入。")continue# 跳过本次循环,重新要求输入ifmust_be_int:# 如果调用时传了 must_be_int=Truetry:returnint(text)# 尝试把字符串转成整数,成功就返回exceptValueError:# 转失败(如输入了"abc")会抛异常,被except捕获print("输入错误,请输入整数!")continue# 重新要求输入returntext# 不需要校验整数,直接返回# ============================================# 功能三:保存到Excel(核心中的核心)# ============================================## 核心逻辑一句话:"有则更新,无则新增,不动别人"## 分两种情况:# 1. 文件不存在 → 创建新文件,画表头,写第一条数据# 2. 文件已存在 → 打开文件,找这个商品# · 找到了 → 更新那一行的数据(其他商品不动)# · 没找到 → 在表格最下面新增一行## 参数说明:# sku: 商品名称# stock_num: 当前库存数量# warn_threshold: 安全库存阈值# need_replenish: "是"或"否",来自 stock_warning() 的返回值# ============================================defsave_to_excel(sku,stock_num,warn_threshold,need_replenish):"""把商品库存信息写入Excel,有则更新,无则新增"""# 表头文字,Excel第一行要显示这些列名headers=["商品名称","当前库存","安全库存阈值","是否需要补货/进货"]# ---------- 情况1:Excel文件已存在 ----------ifos.path.exists(EXCEL_FILE):# os.path.exists() 检查文件是否存在wb=openpyxl.load_workbook(EXCEL_FILE)# 加载已有的Excel文件ws=wb.active# .active 获取当前正在使用的工作表(Sheet)found=False# 标记:是否找到这个商品?先假设没找到# 遍历已有数据,从第2行开始(第1行是表头,不用看)# ws.max_row 是Excel最后一行的行号forrowinrange(2,ws.max_row+1):# ws.cell(row=行号, column=1) 取第1列(商品名称列)的单元格# .value 取单元格里的文字ifws.cell(row=row,column=1).value==sku:# 找到同名商品!更新这一行4个单元格的数据# enumerate([数据列表], 1) 产生 (列号, 值) 的配对,从第1列开始forcol,valinenumerate([sku,stock_num,warn_threshold,need_replenish],1):cell=ws.cell(row=row,column=col,value=val)# 写入数据cell.alignment=Alignment(horizontal="center",vertical="center")# 水平+垂直居中found=True# 标记为"已找到"print(f"已更新{sku}的库存信息。")break# 找到了就跳出循环,后面不用再找了# 循环结束,如果 found 还是 False,说明遍历完所有行都没找到这个商品ifnotfound:new_row=ws.max_row+1# 最后一行的下一行,就是新增的位置forcol,valinenumerate([sku,stock_num,warn_threshold,need_replenish],1):cell=ws.cell(row=new_row,column=col,value=val)cell.alignment=Alignment(horizontal="center",vertical="center")print(f"已新增{sku}的库存信息。")# ---------- 情况2:Excel文件不存在,从零创建 ----------else:wb=openpyxl.Workbook()# 创建一个全新的Excel工作簿ws=wb.active# 获取默认的第一张工作表ws.title="多商品安全库存预警表"# 给这张表起个名字# 画表头(第1行):灰色背景 + 黑色粗体 + 居中forcol,headerinenumerate(headers,1):cell=ws.cell(row=1,column=col,value=header)# 写入表头数据cell.font=Font(bold=True,color="000000")# 黑色粗体字cell.fill=PatternFill(start_color="D3D3D3",end_color="D3D3D3",fill_type="solid")# 浅灰背景cell.alignment=Alignment(horizontal="center",vertical="center")# 写第一条数据(第2行),同样居中forcol,valinenumerate([sku,stock_num,warn_threshold,need_replenish],1):cell=ws.cell(row=2,column=col,value=val)cell.alignment=Alignment(horizontal="center",vertical="center")# 设置列宽,让表格好看不拥挤# zip() 把两个列表按位置一对一配对:A→25, B→16, C→16, D→25forcol_letter,widthinzip(["A","B","C","D"],[25,16,16,25]):ws.column_dimensions[col_letter].width=widthprint(f"已创建{EXCEL_FILE},并写入{sku}的信息。")# 不管上面走的是"更新"还是"新增"还是"创建",最后都要保存并关闭wb.save(EXCEL_FILE)# 保存到硬盘wb.close()# 关闭文件,释放资源# ============================================# 程序入口:主循环# ============================================## 流程图:# 输入商品名 → 输入库存数 → 输入安全阈值(回车默认15)→ 判断预警 → 保存Excel# ↑___________________________________________________________↓# 循环,继续下一件商品# ============================================defmain():# 打印欢迎界面globalwarn_threshold# 定义全局变量warn_thresholdprint("*"*40)print(" 多商品安全库存预警系统 ")print("*"*40)print("提示:任意环节输入q或Q即可退出")print("*"*40)whileTrue:# 无限循环,一件接一件录入商品print("\n"+"="*40)# 打印一条分隔线,让界面清晰# 第1步:输入商品名称# get_input 只传一个参数,must_be_int 用默认值 False,只校验非空sku=get_input("请输入商品名称 (q或Q退出): ")ifskuisNone:# 用户输入了q,返回None,退出程序print("拜拜!")break# break 跳出while循环,程序结束# 第2步:输入库存数量# 传 must_be_int=True,强制要求输入整数stock_num=get_input("请输入库存数量 (q或Q退出): ",must_be_int=True)ifstock_numisNone:print("拜拜!")break# 第3步:输入安全库存阈值# 这里直接用 input(),因为要支持"直接回车"使用默认值whileTrue:warn_input=input("请输入安全阈值 (q或Q退出, 回车默认15): ").strip()ifwarn_input.lower()=="q":#用户输入为Q或qbreak# 【默认参数思想的实际运用】# 函数里用 warn_threshold=15 做默认参数,# 这里用户直接回车,程序同样用15作为默认值,# 两者思想一致:"大多数情况用这个数,特殊情况再改"ifwarn_input=="":# 用户直接回车,输入为空字符串warn_threshold=15# 使用默认值15print("使用默认阈值: 15")breakelse:try:warn_threshold=int(warn_input)# 用户输入了自定义阈值exceptValueError:# 输入不是整数(如"abc")print("输入无效,请输入整数。")continuebreakifwarn_input.lower()=="q":print("拜拜!")break# 第4步:调用预警判断函数# 把用户输入的库存和阈值传进去,得到"是"或"否"need=stock_warning(stock_num,sku,warn_threshold)# 第5步:保存到Excel# 把4个信息全部传给 save_to_excel,由它决定是更新还是新增save_to_excel(sku,stock_num,warn_threshold,need)print(f"已保存excel文件到:{os.path.abspath(EXCEL_FILE)}")# ============================================# 程序启动开关# ============================================# if __name__ == "__main__": 是Python的固定写法,意思是:# "只有当直接运行这个文件时,才执行 main() 函数"# 如果这个文件被别的文件导入,main() 不会自动执行# ============================================if__name__=="__main__":main()

核心功能讲解

Python多货品安全库存预警脚本的核心功能用流程图表示。
该流程图的内容用两句话来简要概括,那就是:输入商品 → 输入库存 → 输入安全库存阈值(回车默认15)→ 判断预警 → 写入Excel(有则更新/无则新增/无文件则创建)→ 循环继续下一件。并且整个流程里任意一步输入 q 或 Q,都会直接打印"拜拜!"并结束程序。
该脚本的流程图如下。

▶ 【程序启动】
└─ 打印欢迎界面
└─ 提示:输入 q/Q 可随时退出


▶ 【主循环】开始录入第 N 件商品


▶ ① 输入商品名称
├─ 输入 q/Q ───→ 【退出】打印"拜拜!"
├─ 输入为空 ─→ 提示"输入不能为空,请重新输入",返回重输
└─ 正常输入 ───→ 保存商品名,继续


▶ ② 输入当前库存数量
├─ 输入 q/Q ────→ 【退出】打印"拜拜!"
├─ 输入为空 ─→ 提示"输入不能为空,请重新输入",返回重输
├─ 输入非整数 ─→ 提示"输入错误,请输入整数",返回重输
└─ 正常整数 ────→ 保存库存数,继续


▶ ③ 输入安全库存阈值
├─ 输入 q/Q ─────→ 【退出】打印"拜拜!"
├─ 直接回车(空输入)→ 自动使用默认值 15
├─ 输入非整数 ────→ 提示"输入错误,请输入整数",返回重输
└─ 正常整数 ─────→ 保存阈值,继续


▶ ④ 库存预警判断
├─ 当前库存 < 安全阈值?
│ ├─ 是 → 🔴 打印"库存不足,该补货了!"
│ │ 返回结果 = “是”
│ └─ 否 → 🟢 打印"库存正常,无需补货"
│ │ 返回结果 = “否”
└─ 返回"是/否"结果


▶ ⑤ 写入 Excel 文件
├─ 文件已存在?
│ ├─ 否 → 【创建新文件】
│ │ ├─ 新建工作簿 + 命名工作表
│ │ ├─ 第1行画表头(灰底黑体居中)
│ │ │ 【商品名|当前库存|安全库存阈值|是否需要进货/补货】
│ │ ├─ 第2行写入第一条数据
│ │ └─ 调整列宽
│ └─ 是 → 打开文件,逐行查找商品名
│ ├─ 找到了?
│ │ ├─ 是 → 更新该行4个单元格
│ │ │ 打印"已更新"
│ │ └─ 否 → 表格底部新增一行
│ │ 打印"已新增"
│ └─ 所有数据居中显示
├─ 保存到硬盘 → 关闭释放资源
└─ 打印文件完整路径


▶ ⑥ 一件商品处理完毕
└─ 回到主循环顶部
继续录入下一件商品
(重复 ①→②→③→④→⑤)

Python运行环境安装

在运行多货品安全库存预警系统的之前,需要做的重要的前置准备是安装和使用Pycharm和Python.exe。如果你们对安装和使用Pycharm和Python.exe一窍不通,那么请阅读如下两篇文章。
安装Pycharm+配置python.exe:0基础新手一次成功
如何使用PyCharm?0基础新手必看!七大核心功能+越用越有意思

这个脚本还能用在哪些场景

能用多货品安全库存预警系统的场景中,除了在仓库里根据多货品的当前库存、安全库存阈值来判断多货品是否进货/补货的场景外,还能用在多品类办公用品/耗材领用预警、多品类实验室工具/仪器管理、多品类小卖部食材管理、多品类小型工厂/作坊的原材料/零件管理等等。
切换场景使用多货品安全库存预警系统时,不用改代码,直接运行使用就可以了。

复盘总结

本文详细讲解了Python多货品安全库存预警系统的运行结果、源码、核心功能,解决了库管的统一设置所有货品安全库存阈值产生的问题,同时它运用了Python函数的默认参数,供Python小白练手,使Python小白熟练掌握、灵活运用Python函数的默认参数。
对于库管来说,读到这块,相信你已经赢了遇到统一设置所有货品安全库存阈值产生的问题后没有解决的库管,真的挺棒了!
对于Python小白来说,读到这里,相信你已经赢了没有学Python函数的默认参数或只学Python函数的默认参数理论而不去练手的Python小白,真的挺了不起!

完整资源文件下载

如果你觉得复制粘贴麻烦,想更省事,那么我这里有完整的Python多货品安全库存预警系统的源码的.py文件,其链接如下,点击链接下载且在Pycharm中找到该.py文件运行即可。
Python+Excel 多商品安全库存预警系统|库管库存管理|Python 小白入门|毕设课设源码

专栏下篇剧透

在专栏中,下一篇文章讲的是用Python函数的语法知识解决库存管理痛点的干货。
如果你觉得我写的文章有帮助、有用,或者你喜欢读我写的文章,请动一动宝贵的金手指,进行点赞、收藏、转发加关注,你的支持是我继续创作的动力,我会感激不尽!
关注我,我会发布更多安装和使用编程软件、Python及其他编程语言的语法知识、突破Python及其他编程语言的语法知识的痛点、Python及其他编程语言实战的干货。
如果你在Python语法、库存管理等方面有疑惑、问题,或你对我写的文章有疑问,那么欢迎你到评论区留言,我看到后会一一回复。