十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python新手库管用while循环,3分钟实现自动盘点,告别熬夜对账

Python新手库管用while循环,3分钟实现自动盘点,告别熬夜对账 阅读提示本文主要面向库管与台账业务人员包含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.exe0基础新手一次成功如何使用PyCharm0基础新手必看七大核心功能越用越有意思自动盘点系统实战需求分析我们要实现什么功能本章用while循环解决库存盘点三大痛点需要实现哪些功能呢实现的功能如下。1.输入商品名称。2.输入商品数量即扫描商品数量。3.分别显示每次盘点的数量和累计数量。4.提示按哪个键可以重盘。5.最后生成盘点报表。过程中提示输入q或Q可随时退出。基础版单商品盘点print(单商品自动盘点系统)#第1步输入需要盘的这一种商品名如笔记本电脑goodinput(请输入今日盘点商品名).strip()#第2步目前商品以盘点数量为0total_number0print(f开始盘点{good}请连续扫码输入q或Q结束,输入ok重新盘点)#第3步while无限循环一直给商品扫码一直加数量直到输入q为止whileTrue:#提示语里带上当前累计已盘点数方便知道盘到多少了check_quantityinput(f当前累计{total_number}件请输入扫码数量输入q或Q结束,输入ok重新盘点).strip()#退出按键输入q或Q就结束盘点ifcheck_quantity.lower()q:break#输入ok重新盘点ifcheck_quantity.lower()ok:total_number0print(f商品{good}的数量已清零。)continue#安全防护万一输的内容不是数字比如手滑了输成%^%或我我程序不会崩溃try:check_numberint(check_quantity)ifcheck_number0:#正常情况把这次扫的数量加到已经盘点的总数里total_numbercheck_numberprint(f新增{check_number}件总计{total_number}件。)elifcheck_number0:#特殊情况输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()是去掉输入时不小心按的空格nameinput(\n商品名称输q或Q退出).strip()#如果输入q大小写都行就结束整个盘点工作去打印报表ifname.lower()q:break#【重要】如果这本账上还没登记过这个商品先给它写个0件#防止第一次扫码时系统说找不到这个商品ifnamenotinstore:store[name]0#小循环专门针对这一个商品连续扫多次码比如一箱一箱地扫码whileTrue:number_inputinput(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:numberint(number_input)ifnumber0:#把扫码的这个数量加到该商品的盘点总数上累加store[name]numberprint(f已扫{name}的数量为{number},已盘点{store[name]}件。)elifnumber0:#特殊情况:发现这个商品一件都没了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表格工具用来生成财务要的报表actionTrueprint(仓库盘点助手)# 【系统库存数】# 作用ERP/系统里应该有多少件平时从电脑里抄过来这里先写死示例# 盘点就是拿这个数 对比 你实际扫出来的数算差异system_quantity{曲奇饼干:200,好吃点:70,礼拜天原味方糕:200}# 【电子账本】# 作用记住你扫了多少件商品# 格式{商品名: 数量}比如 {薯片: 50}inventory{}# 第一步扫码录入大循环一直盘直到输q或Q退出 whileaction:# strip()是去掉输入时不小心按的空格nameinput(输入商品名开始对账输q或Q退出).strip()# 输q表示盘完了去看对账结果ifname.lower()q:break# 如果是新商品账本上没有先给它写个0件ifnamenotininventory:inventory[name]0# 如果系统里也没有这个商品新品系统数默认0避免报错ifnamenotinsystem_quantity:system_quantity[name]0#【小循环】专门针对这一个商品连续扫多次比如一箱一箱扫whileTrue:#提示语带当前累计数方便知道扫了多少numberinput(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:quantityint(number)ifquantity0: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():systemsystem_quantity.get(name,0)# 从系统数里取取不到默认0different_datareal_data-system# 差异计算# 无表示正好对上5表示盘盈多了5件-3表示盘亏少了3件flag无ifdifferent_data0elsef{different_data:d}print(f{name:11}{system:9}{real_data:9}{flag:9})# 【简单菜单】就3个选择choiceinput(输1导出Excel报表输2重盘某个商品输q或Q退出).strip()ifchoice.lower()q:break#输入Q或q彻底退出程序elifchoice1:# 【生成盘点报表】Excel能直接打开财务直接能用# 文件名带时间如盘点表_0329_1542.csv防止覆盖之前的filenamef盘点表_{datetime.now().strftime(%m%d_%H%M)}.csv# with open是安全写法用完自动关闭文件# utf-8-sig编码让Excel打开不乱码withopen(filename,w,newline,encodingutf-8-sig)asf:wcsv.writer(f)# 写表头第一行标题w.writerow([商品,系统数量,实盘数量,差异,时间])# 写每一行数据forname,real_dataininventory.items():systemsystem_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发现错了再重盘elifchoice2:# 【重盘功能】发现某个商品数错了不用重启程序直接重盘nameinput(要重盘哪个商品(输入商品名)).strip()ifnameininventory:inventory[name]0# 先清零print(f{name}已清零请重新扫描{name}数量...)# 这里复用第一步的扫码逻辑小循环whileTrue:numberinput(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解决实战痛点、编程常见坑点、开发工具安装使用指南等。如果你们觉得此文章有不足之处欢迎你们在评论区留言指正。
返回列表