由Python生成采购清单BOM
采购清单BOM的生成
问题:
公司在原型板焊接的时候,经常需要采购多块板子的器件,而其中很多器件型号都是相同的。采购部门会要求我们把所有相同的型号归类。
这是一件耗时而又无趣的工作, 所以需要最好能够自动生成采购清单。
解决办法:
因为我们的BOM文件都是excel格式, 而经常看到Python培训的广告, 展示其能够处理excel的强大功能。
因此选择使用Python自己写一个程序来执行合并操作。
解决步骤:
1, 首先看看我们的BOM表的格式
对于采购人员来说, Designator 和footprint是不需要关注的, 他们关注点主要在器件型号, 厂家以及购买数量和购买渠道。
采购清单的格式主要如下
2, Python, 你强你上
附上具体的代码, 本人第一次写Python,肯定有不优雅的地方,欢迎高手们将程序改进。
import pandas as pd
import os
import numpy as np#how to use
#1, copy all board BOMs to same directory with this python file
#2, Run this script in python IDE or other python software
#3, input the QTY for each board
#4, it generate a Purchase.xlsx in current folderoutput_file_name="Purchase.xlsx"
fileNames=[]keyCode="StockCode"
Comment="Comment"
Desc="Description"
QTY="Quantity"
Manufature="Manufature"
Mpart="Manufacture part"
Supplier="Supplier1"
SPart="Suppiler1 part"#finalCols=[keyCode, Comment, Desc, Manufature, Mpart, Supplier, SPart, QTY]def pre_process_excelfile(excel_files):global fileNamespath, fileName = os.path.split(excel_files)fileName, file_extension = os.path.splitext(fileName)#read excel filedataframe = pd.read_excel(excel_files);#search position of Stockcode inrow_start=Nonefor row in range(dataframe.shape[0]): for col in range(dataframe.shape[1]):if dataframe.iat[row,col] == keyCode:row_start = rowkeyCodeColumn=col#print(row_start)break;#set column names and delete file header partif(row_start is None):print("stockCode not found, not BOM file\n")elif(row_start > 1):dataframe.columns = dataframe.iloc[row_start]dataframe.drop(dataframe.index[row_start], inplace=True)dataframe.drop(dataframe.index[range(0,row_start)],axis=0, inplace=True)#delete file tailsdataframe=dataframe.loc[dataframe[keyCode].notnull()]#delete columnsdataframe = dataframe.dropna(axis = 1, how = 'all')#pick up columns and change qty column namedataframe = dataframe[[keyCode, Comment, Desc, Manufature, Mpart, Supplier, SPart, QTY]]dataframe.columns = dataframe.columns.str.replace(QTY,fileName)fileNames.append(fileName)#input QTY boards for assemblyBOMQty=input("How manmy boards needed for "+fileName +" ?")print(BOMQty)dataframe[fileName+'.QTY']= BOMQtyreturn dataframe#
path=os.getcwd()
print(path)#delete output file to avoid combining it
outputFile=os.path.join(path, output_file_name)
if os.path.isfile(outputFile):os.remove(outputFile)result=pd.DataFrame()
for filename in os.listdir (path):if filename.endswith ('.xlsx'):read_filename=os.path.join(path, filename)dataframe=pre_process_excelfile(read_filename)if(result.empty):result=dataframe;else:result = result.merge(dataframe, on=[keyCode, Comment, Desc, Manufature, Mpart, Supplier, SPart], how='outer', sort=True)#sort data according to StockCode
dataframe=result
dataframe=dataframe.sort_values(by=keyCode)
dataframe.groupby(keyCode)#fill nan with 0 in order to do multipy operation
dataframe.replace(np.nan, 0, inplace=True)#calculate total
dataframe['total']=0
for eachfile in fileNames:dataframe[eachfile] = dataframe[eachfile].astype(int)dataframe[eachfile+'.QTY'] = dataframe[eachfile+'.QTY'].astype(int)dataframe['total']=dataframe['total']+(dataframe[eachfile]) * (dataframe[eachfile+'.QTY'])#fill back with nan
dataframe.replace(0,np.nan, inplace=True)#writeback a excel file
result_filename=os.path.join(path, output_file_name)
dataframe.to_excel(result_filename, index = False)print("Done, and Generate "+ output_file_name + " at " +path +" !")
3, 代码的使用方法
1, 拷贝代码并保存为merge excels.py
2, 安装PythonIDLE
本人使用的版本是3.8.2
3, 拷贝各个PCB板的对应BOM文件到相同目录下, 和merge excels.py在同一目录。
4,运行PythonIDLE
File->open(merge excels.py)
然后直接run
根据提示输入制板的数量。 本人在这里展示了板子1需要购买的元器件的套数是10, 板子2的套数是20
当前目录下会生成新的文件Purchase.xlsx。
文件中的H列是单个板子1的数量, 列I是板子的套数。J列是单个板子2的数量, 列K是板子的套数
最后的总数total=H*I+J*K.
由Python生成采购清单BOM相关推荐
- pipreqs生成python项目依赖清单
pipreqs生成python项目依赖清单 环境 pip install pipreqs 在项目目录下 pipreqs ./ 报错: Traceback (most recent call last) ...
- python 字典 列表 速度_高效使用Python字典的清单
字典(dict)对象是 Python 最常用的数据结构,社区曾有人开玩笑地说:"Python企图用字典装载整个世界",字典在Python中的重要性不言而喻,这里整理了几个关于高效使 ...
- python生成csv乱码
python 生成 csv乱码: 从本地生成的csv通过flask传输下载全乱码了,但是在本地读取正常. 解决问题尝试查到比较多的方案: encoding='utf-8' encoding='utf- ...
- 使用OpenCV和Python生成视频条形码
使用OpenCV和Python生成视频条形码 1. 效果图 2. 原理 2.1 步骤 2.2 项目结构 3. 源码 参考 这篇博客将演示如何使用Python + OpenCV生成视频条形码. 生成视频 ...
- python生成订单号或生成任意序列
python生成订单号或生成任意序列 示例代码: import time# 生成订单号 def get_order_code():# 年月日时分秒+time.time()的后7位order_no = ...
- 独家 | 手把手教你怎样用Python生成漂亮且精辟的图像(附教程代码)
作者:Fabian Bosler 翻译:车前子 校对:吴振东 本文约4800字,建议阅读15分钟. 本文将介绍如何利用Python生成图像并将结果做出可视化分析. 在上周的文章<用python从 ...
- Python生成随机五位数——模仿手机验证码
使用Python生成随机的五位手机验证码. # -*- coding:utf-8 -*-#生成五位随机数,模仿手机验证码#导入random库,可以生成随机数 import randomdef ran( ...
- python生成时间戳_python生成13位或16位时间戳以及反向解析时间戳的实例
我就废话不多说了,直接上代码吧! import datetime import time def get_float_time_stamp(): datetime_now = datetime.dat ...
- python 词云_利用Python生成词云
利用Python生成词云 一.第三方库的安装与介绍 1.1 Python第三方库jieba(中文分词) 1.介绍 "结巴"中文分词:做最好的 Python 中文分词组件. 2.特 ...
最新文章
- db9小波包分解matlab,小波包分解、重构 matlab代码
- 2015年部分互联网公司笔试综合题及答案
- 如果你恨一个程序员,忽悠他去做iOS开发
- html基本标签与属性
- php css布局技巧,最全的CSS开发常用技巧
- GPS/轨迹追踪、轨迹回放、围栏控制
- Java工作笔记-Nginx配置IPHash(单点登录)
- ac automaton 专题
- hibernate4调用mysql存储过程_Hibernate4.x执行mysql的存储过程
- linux es数据库 head,Elasticsearch可视化插件ES-HEAD安装启动步骤
- java8的下载与安装(网上教程的安装方法)
- 201015.阅读和了解什么是形式化方法
- 关于APP接口设计 注意事项
- pdf 加深 扫描件_扫描文字字体如何加深 pdf扫描件字体加深
- 学习人工智能导论(3)
- 使用LSTM神经网络+CTC loss识别freetype库生成的不定长验证码
- C++基础算法 | 单调栈(Monotonous Stack)
- python春节对客流量的影响_2018年2月各城市地铁日均客流、春节长假日均客流分析...
- 期货市场倒挂什么意思(期货市场倒挂什么意思啊)
- [DP]Apple Catching G