📌阅读提示:本文主要面向库管与台账业务人员,包含Python语法、安装和使用Pycharm和Python.exe的讲解。如果您没有库存相关业务背景,部分业务案例不容易看懂。
为什么库管需要Python?
传统盘点的三大噩梦:手误、耗时、对不上账
学Python的新手和库管在用传统方式手工盘点仓库货物时,常常遇到各种麻烦:盘点失误、盘错商品、看错行、耗时长效率低,而且一旦发现账实不符,查找差异更是让人头疼,不得不重新盘点。这非常浪费时间!尤其是在业务繁忙时,工作量激增,上述问题很容易导致加班。明明已经很认真地在盘点,却还是要加班,我真的非常理解、非常心疼你们。
不过别担心,**单商品盘点脚本(基础版)、多商品分类盘点脚本(进阶版)、自动盘点+数据导出+对账脚本(高级版)**这三种运用while循环的脚本可以彻底解决这些问题。
它们能有效避免手误、大幅缩短耗时、解决对账难题,让学Python的新手和库管都能准时下班,不再让工作侵占生活时间,也不必为加班而烦恼。
但在使用这些脚本之前,你们需要先掌握while循环的相关语法。只有看懂、会用、能改,这三个脚本才能真正为你所用。如果你们还没掌握while循环,可以先阅读下面的入门文章。
Python新手在PyCharm写while必踩5坑
盘点自动化的优势(效果预览)
传统手工盘点一种商品平均需要10-15分钟(含计数、记录、核对),而使用扫码自动盘点的脚本可压缩至3-5分钟,综合效率提升60-70%。
为什么选while循环?(最简单的自动化逻辑)
为什么选while循环?
因为while循环让你自己决定扫描商品的数量和次数,想什么时候纠错或停止,完全由你掌控。
为什么不选for循环?
因为for循环是"开弓没有回头箭"——一旦开始,扫描次数和停止时机都不是你能决定的,而是由循环本身固定好的
零基础环境搭建
Python和Pycharm下载安装和使用
在用while循环编写解决手误、耗时、对账这三大痛点的脚本之前,你们需要先安装Python和PyCharm。如果你们还不会安装使用,请参考下面两篇文章。
安装Pycharm+配置python.exe:0基础新手一次成功
如何使用PyCharm?0基础新手必看!七大核心功能+越用越有意思
自动盘点系统实战
需求分析:我们要实现什么功能?
本章用while循环解决库存盘点三大痛点,需要实现哪些功能呢?
实现的功能如下。
1.输入商品名称。
2.输入商品数量(即扫描商品数量)。
3.分别显示每次盘点的数量和累计数量。
4.提示按哪个键可以重盘。
5.最后生成盘点报表。
过程中,提示输入"q"或"Q"可随时退出。
基础版:单商品盘点
print("=====单商品自动盘点系统=====")#第1步:输入需要盘的这一种商品名(如笔记本电脑)good=input("请输入今日盘点商品名:").strip()#第2步:目前商品以盘点数量为0total_number=0print(f"开始盘点{good},请连续扫码(输入q或Q结束,输入ok重新盘点)")#第3步:while无限循环,一直给商品扫码一直加数量,直到输入q为止whileTrue:#提示语里带上当前累计已盘点数,方便知道盘到多少了check_quantity=input(f"当前累计{total_number}件,请输入扫码数量(输入q或Q结束,输入ok重新盘点):").strip()#退出按键:输入q或Q就结束盘点ifcheck_quantity.lower()=='q':break#输入ok,重新盘点ifcheck_quantity.lower()=='ok':total_number=0print(f"商品{good}的数量已清零。")continue#安全防护:万一输的内容不是数字(比如手滑了输成"%^&%"或"我我"),程序不会崩溃try:check_number=int(check_quantity)ifcheck_number>0:#正常情况:把这次扫的数量加到已经盘点的总数里total_number+=check_numberprint(f"新增{check_number}件,总计{total_number}件。")elifcheck_number==0:#特殊情况:输0可能是误触,提醒未增加盘点数量print(f"输入为0,未增加数量,总计{total_number}件。")else:#负数在现实库存盘点中不存在,拦截print("数量不能为负数!")exceptValueError:#输入内容无法转化成数字时形成如下提示print("输入错误,请输入数字(如3)。")# 第4步:盘点结束,打印最终报表print(f"========单商品盘点结果========")print(f"商品{good}的最终数量为{total_number}件。")进阶版:多商品分类盘点
# ==========================================# 进阶版:多商品分类盘点# 适合场景:仓库里有多种商品,需分别统计# ==========================================print("=======多商品盘点系统=======")#创建一个"电子账本"(字典),用来记录每个商品盘了多少件#格式为:{商品名: 数量},比如 {"苹果": 10, "香蕉": 5}store={}#大循环:一直盘点,直到库管员说"下班了"(输入q退出)whileTrue:#询问要盘哪个商品,strip()是去掉输入时不小心按的空格name=input("\n商品名称(输q或Q退出):").strip()#如果输入q(大小写都行),就结束整个盘点工作,去打印报表ifname.lower()=='q':break#【重要】如果这本账上还没登记过这个商品,先给它写个"0件"#防止第一次扫码时系统说"找不到这个商品"ifnamenotinstore:store[name]=0#小循环:专门针对这一个商品,连续扫多次码(比如一箱一箱地扫码)whileTrue:number_input=input(f"扫描{name}数量(输入q或Q退出,输入recheck重新盘点{name}数量,输入ok换商品):")# 输入recheck是把已盘点该商品的数量清零,重新盘点该商品ifnumber_input.lower()=="recheck":store[name]=0print(f"商品{name}已清零。")continue#q、Q是彻底退出,ok是把这个商品盘完了,换下一个商品继续盘ifnumber_input.lower()in['q','ok']:break#把输入的内容转成数字,如果输的是"&……*"就会报错,所以用try保护try:number=int(number_input)ifnumber>0:#把扫码的这个数量加到该商品的盘点总数上(累加)store[name]+=numberprint(f"已扫{name}的数量为{number},已盘点{store[name]}件。")elifnumber==0:#特殊情况:发现这个商品一件都没了print(f"已扫{name}的数量为{number},已盘点{store[name]}件。")else:#防止手滑输入负数(比如-5件),这不符合现实print("数量不能为负!")except:#如果输入的不是数字(比如"五"或"abc"),提醒重新输入print("请输入数字")# ==================多商品盘点结束,打印报表==================print("===========多商品盘点结果=================")#遍历账本,把每个商品的名字和数量都打印出来#products为商品名,quantity为数量forproducts,quantityinstore.items():print(f"{products}的数量有{quantity}件。")高级版:自动盘点+数据导出+对账,告别熬夜
fromdatetimeimportdatetime#导入时间工具(给文件加时间戳,防覆盖)importcsv#导入Excel表格工具(用来生成财务要的报表)action=Trueprint("=======仓库盘点助手=======")# 【系统库存数】# 作用:ERP/系统里"应该有多少件"(平时从电脑里抄过来,这里先写死示例)# 盘点就是拿这个数 对比 你实际扫出来的数,算差异system_quantity={"曲奇饼干":200,"好吃点":70,"礼拜天原味方糕":200}# 【电子账本】# 作用:记住你扫了多少件商品# 格式:{商品名: 数量},比如 {"薯片": 50}inventory={}# ========== 第一步:扫码录入(大循环:一直盘,直到输q或Q退出) ==========whileaction:# strip()是去掉输入时不小心按的空格name=input("输入商品名开始对账(输q或Q退出):").strip()# 输q表示"盘完了,去看对账结果"ifname.lower()=="q":break# 如果是新商品(账本上没有),先给它写个"0件"ifnamenotininventory:inventory[name]=0# 如果系统里也没有这个商品(新品),系统数默认0,避免报错ifnamenotinsystem_quantity:system_quantity[name]=0#【小循环】专门针对这一个商品,连续扫多次(比如一箱一箱扫)whileTrue:#提示语带当前累计数,方便知道扫了多少number=input(f"扫商品{name}的数量(输ok换下一个,recheck重盘,Q或q退出):")# 输入Q或q退出小循环ifnumber.lower()=="q":break#recheck = 发现数错了,清零重新数ifnumber.lower()=="recheck":inventory[name]=0print(f"{name}清零了,重新扫{name}的数量。")continue# 跳过下面,重新问数量#ok = 这个商品盘完了,换下一个商品ifnumber.lower()=='ok':break# 跳出小循环,回到大循环问下一个商品名#【安全防护】把输入转成数字,如果输成"abc"会报错,所以用try保护try:quantity=int(number)ifquantity>=0:inventory[name]+=quantity# 累加:这次扫的数量加到总数里print(f"已扫{name}{quantity}件,现在共{inventory[name]}件")else:print("不能输负数!")except:# 转数字失败,比如输成了"五"或"&&"print("请输入数字!")# ========== 第二步:对账+导出(自动算差异,生成报表) ==========whileaction:# 【显示对账表】一眼看出哪些商品多了/少了print("----------------------对账结果-----------------------")print(f"{'商品':<11}{'系统':<9}{'实盘':<9}{'差异':<9}")print("-"*40)# 逐个商品对比:实盘数 - 系统数 = 差异forname,real_dataininventory.items():system=system_quantity.get(name,0)# 从系统数里取,取不到默认0different_data=real_data-system# 差异计算# 无表示正好对上;+5表示盘盈多了5件;-3表示盘亏少了3件flag="无"ifdifferent_data==0elsef"{different_data:+d}"print(f"{name:<11}{system:<9}{real_data:<9}{flag:<9}")# 【简单菜单】就3个选择choice=input("输1导出Excel报表,输2重盘某个商品,输q或Q退出:").strip()ifchoice.lower()=='q':break#输入Q或q彻底退出程序elifchoice=='1':# 【生成盘点报表】Excel能直接打开,财务直接能用# 文件名带时间(如:盘点表_0329_1542.csv),防止覆盖之前的filename=f"盘点表_{datetime.now().strftime('%m%d_%H%M')}.csv"# with open是安全写法,用完自动关闭文件# utf-8-sig编码让Excel打开不乱码withopen(filename,'w',newline='',encoding='utf-8-sig')asf:w=csv.writer(f)# 写表头(第一行标题)w.writerow(['商品','系统数量','实盘数量','差异','时间'])# 写每一行数据forname,real_dataininventory.items():system=system_quantity.get(name,0)w.writerow([name,system,real_data,real_data-system,datetime.now().strftime('%m-%d %H:%M')])print(f"✅ 报表已保存:{filename},直接发给财务")# 导出后可以按q下班,或者按2发现错了再重盘elifchoice=='2':# 【重盘功能】发现某个商品数错了,不用重启程序,直接重盘name=input("要重盘哪个商品(输入商品名):").strip()ifnameininventory:inventory[name]=0# 先清零print(f"{name}已清零,请重新扫描{name}数量...")# 这里复用第一步的扫码逻辑(小循环)whileTrue:number=input(f"扫{name}数量(输ok结束):")ifnumber.lower()=='ok':breaktry:inventory[name]+=int(number)print(f"已扫{name}{number}件,当前总共{inventory[name]}件。")ifint(number)==0:print(f"已扫{name}{number}件,当前总共{inventory[name]}件。")ifint(number)<0:print("不能输负数!")except:print("请输入数字")# 重盘完会自动回到对账表,可以立刻看到新数字else:print("你输入的商品没有第一次盘点过。")print("数据已保存好。")
如下图所示,这是代码运行后打开生成最新盘点报表文件的截图。
总结与学习路线
本章将通过单商品盘点脚本(基础版)、多商品分类盘点脚本(进阶版)、自动盘点+数据导出+对账脚本(高级版)这三个脚本,解决了手误、耗时、对账三大痛点。
学Python的新手和库管看懂这三个脚本后,可以根据仓库实际情况直接复制使用,或进行个性化修改。
看到这里,你们已经很棒了,已经超越一大半还在手工盘点的人!这篇文章送给所有想靠技术翻身的你们。
专栏下篇剧透
在专栏中,下篇文章将继续讲解用while循环解决库存管理痛点的实战内容,敬请期待!
如果你们觉得这篇文章有用,请动动你们最宝贵的手指点赞、收藏、转发、关注。
关注我,我会持续发布更多干货:Python语法、Python解决实战痛点、编程常见坑点、开发工具安装使用指南等。
如果你们觉得此文章有不足之处,欢迎你们在评论区留言指正。