python: 产品选型小软件
Introduction
目标功能:用户输入产品系列名即可查询到相应的芯片具体型号、内核消息、Flash/RAM大小,封装类型以及工作温度。软件可方便用户进行芯片选型,无需翻找芯片选型手册。
现有工具:Pycharm、芯片选型手册PDF
需要用到的库:camelot-py、os、sys、json、fire
实现思路:
芯片选型手册中收录了MM32各个系列共7张表格,首先想到的方法是提取PDF中的这7张表格数据,再对表格数据进行查找。选用了Camelot: PDF Table Extraction for Humans,通过这个轮子,可以方便地提取PDF文件中的表格数据。Camelot具体的使用方法下面会介绍。
提取表格数据直接查找有两种实现方法: 1-1 指定表格页码,精确提取相应表格 1-2 提取所有表格,再进行查找
方法1-1需要对每张表格指定页码,不便于后期维护。
方法1-2每次读取PDF中的所有表格耗费时间太长。通过Camelot将提取的表格数据转成json格式,再对json格式进行操作查找。
通过Camelot将提取的表格数据转成database格式,存入数据库,再对数据库进行操作查找。
方法1-1、1-2及方法2都已通过代码实现。下文具体介绍方法2。
Camelot提取表格
pip安装
pip install camelot-py[cv]
可以使用清华镜像,安装会快很多
pip install camelot-py[cv] -i https://pypi.tuna.tsinghua.edu.cn/simple
将Camelot导入python文件
import camelot.io as camelot
注意在pycharm的setting里要导入的是camelot-py,而不是camelot!如果导错了,记得要把camelot删掉。
但运行报错了……
在「冥更」Python提取PDF中表格数据 中找到了解决办法:需要安装ghostscript,并且去ghostscript官网去下载exe文件安装。
pip install ghostscript
虽然不知道为什么,但照着这么做之后就可以运行啦!
Camelot使用
详细的使用方法可以查阅Camelot Documents,下面介绍几个我用到的功能。
创建表格对象
- 读取指定页数的表格
tables = camelot.read_pdf("Mindmotion product selection manual.pdf",pages = '5,6,7')
如果不加pages这项,默认读取PDF的第一页。Camelot会读取指定页数中的所有表格,并从0开始编号。
- 读取全部页数的表格
tables = camelot.read_pdf("Mindmotion product selection manual.pdf",pages = '1-end')
- 补齐合并表格中的列
camelot.read_pdf("Mindmotion product selection manual.pdf", pages='5', copy_text=['v'])
如果补齐行,修改copy_text = [‘h’]
查看表格对象
- 查看表格个数
tables.n
- 查看表格形状,需指定表格
tables[0]
- 打印表格中的内容
tables[0].df # type is pandas.core.frame.DataFrame tables[0].data # type is list
导出表格内容
- 导出json类型
tables[0].to_json("json/sample.json")
Camelot还支持导出csv、excel、html以及sqlite格式文件,分别使用to_csv、to_excel、to_html、to_sqlite语句。不过,Camelot导出文件是一个表格对应一个文件,合并文件还需要通过python实现。
Camelot的更多高级功能可以查阅Camelot Advanced Usage。
json文件合并
参考了「automate123」python 多个json文件合并,代码如下。
import os
import json
def merge_json():filedir ='json'# get the file name list in current folderfilenames=os.listdir(filedir)# open result.json file in current catalog, create one if it does not exitf=open('json/result.json','w')# traverse the filenamesfor filename in filenames:filepath = filedir+'/'+filename# traverse each file, get the row numberfor line in open(filepath):f.writelines(line)f.write('\n')# close the filef.close()
不过这个合并只是单纯地把json文件内容进行了复制粘贴,合成后的json文件格式需要手动调整一下。
查找芯片型号
- 打开json文件
- 遍历json,查找匹配的系列名称
- 提取匹配的芯片的相应信息存入product_dict
- 将所有匹配的芯片的product_dict合并到product_list
filename = "json/MM32SeriesTable.json"
product_list = []def search_json(name):with open(filename) as f:pop_data = json.load(f)i = 0for pop_dict in pop_data:if(pop_dict['Series'] == "MM32" + name):i = i + 1Num_str = str(i) + "."PartNO_str = pop_dict['PartNO']Core_str = pop_dict['Core']Flash_str = pop_dict['Flash']RAM_str = pop_dict['RAM']Package_str = pop_dict['Package']Temp_str = pop_dict['OperationTemp']product_dict = {"Num": Num_str,"PartNO": PartNO_str,"Core": Core_str,"Flash": Flash_str,"RAM": RAM_str,"Package": Package_str,"Temp": Temp_str}product_list.append(product_dict)
格式化输出
通过以上步骤,已经实现了芯片选型小软件的基本功能,不过现在用户看到的输出信息没有对齐,不美观。
试了很多种方法,最后在「Rambo.John」python中英文输出对齐这里找到的解决方法。解决的思路是让字符串总长度保持一致,不够的补充空格。虽然不是特别好,但可以勉强达到效果。
最后的效果是这样的:
- 判断中英文字符
def isChinese(ch):if ch >='\u4e00' and ch <= '\u9fa5':return Trueelse:return False
计算字符串长度
一个中文所占的字节数是2个字节,相当于两个英文字符。
def lenStr(string):count = 0for line in string:if isChinese(line):count = count + 2else:count = count + 1return count
- 打印统一的字符串长度
gLen = 15
headList = ["Num","PartNO.","Core","Flash","RAM","Package","OperationTemp"]
def show_result():name = input("Please Input the Chip Type:")search_json(name)if(len(product_list) == 0):print("Please Check the Input Chip Type")sys.exit(0)headStr = "".join([x + " " * (gLen - lenStr(x)) for x in headList])print(headStr)print("=" * 110)for product_dict in product_list:lineList = [product_dict["Num"], product_dict["PartNO"], product_dict["Core"], product_dict["Flash"], product_dict["RAM"], product_dict["Package"], product_dict["Temp"]]lineStr = "".join([x + " " * (gLen - lenStr(x)) for x in lineList])print(lineStr)
Fire生成CLIs命令行运行
python生成命令行接口CLIs后就可以通过命令行进行运行,选用了Python Fire,由谷歌开源,不用改变原始代码就可以生成CLIs。
pip安装
pip install fire
fire的使用
使用非常简单,这里传入的是单个函数,详细的用法可以参考The Python Fire Guide
import fireif __name__ == '__main__':fire.Fire(show_result)
pyinstaller生成exe可执行文件
很可惜,还没成功。不过问题总会一个一个一个一个一个地解决的!
py2exe以及pyinstaller都可以将python脚本文件进行打包生成exe文件,这里选用了PyInstaller,可以生成windows、Linux、Mac的可执行文件。
pip安装
pip install pyinstaller
pyinstaller的使用
pyinstaller是在命令行里执行的,详细的用法可以参考Using PyInstaller。
pyinstaller -F mm32_json.py
python: 产品选型小软件相关推荐
- python做界面小软件_PySimpleGUI图形界面绘制及办公自动化小软件的制作
原博地址 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 如若转载,请标明出处,谢谢! 1 PySimpleGUI安装 在命令行/终端输 ...
- python制作mac小软件_python生成mac os app记录-py2app
ok 软件界面设计完了 需要给软件打包成独立能运行的app.我是用了py2app. 刚开始使用pyinstaller 打包app.打包完了点击一闪就没了,花了好几天,一直没有解决.最后另起新路,选择 ...
- python如何开发小软件-Python程序员,如何快速开发一个小程序
要点: 小程序是前后端分离的. 前端使用的是微信自定义的一套规范wxml+wxss+json+js,本质还是html+css+js. 后台可以选用任何你熟悉的语言:Java,Python,PHP,Ru ...
- python制作翻译小软件_如何基于Python制作有道翻译小工具
这篇文章主要介绍了如何基于Python制作有道翻译小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 该工具主要是利用了爬虫,爬取web有道翻译的 ...
- python桌面实验小软件,实现地图信息整理为电子表格
地图数据采集的使用: 1.选择了地区:选择地区如果只选择省份,那么则采集该省下的所有县级关键词数据:同理,如果地区选择到"市级",则采集该市下的所有县级数据. 2.关键词设置:如果 ...
- python制作翻译小软件_python 制作一个翻译软件
from tkinter import * from tkinter import ttk import requests import json class Application(Tk): def ...
- 用Python开发了一个进销存管理的小软件
研究生毕业之后,就进入国企工作,工作内容偏产品和售前,几乎没写过代码了,有个朋友是开游泳馆的,也会有少量商品的售卖,问我能不能给她开发一个小软件,记录商品的入库出库,统计下金额,恰好工作中今年也用到了 ...
- 3星|《大产品,小团队》:携程软件开发流程改进的故事
大产品,小团队:携程敏捷技术与管理转型实战 携程集团创作,作者有产品.开发.测试.PMO等多种角色.有一点比较怪异,每个章节的作者是放在书的最后部分的. 主要内容是携程的软件开发流程改进的故事.携程的 ...
- 用python做一个简单GUI小软件
用python做一个简单软件 前言 这是一个课设,用python做一个扫描王软件 我主要做的GUI部分,记录分享一下.也是第一次用python做小软件,python的方便果然是名不虚传 遇到问题 1. ...
- python 3.8.5 打包_python做个word转pdf的小软件
点击上方蓝字,一起在代码的世界遨游 135编辑器 好久没更新了,因为最近学校这边事情有点多.不过这两天还是花了点时间,陆陆续续将代码和这篇文章写出来.写这个例子其实是最近需要用到几次word转为pdf ...
最新文章
- abb变频器acs800功率_ABB变频器如何选型(1)
- 解决tomcat was unable to start within问题
- linux -------- 使用xshell ,winscp 连接linux 以及一些问题解决
- Android ServiceConnection
- orm设置bool型 python_python基础教程之基本内置数据类型介绍
- 9:01 2009-7-20
- 开源的方舟编译器将进入深圳大学课堂
- 基于JAVA+SpringMVC+MYSQL的数码商城
- 在开启bin-log日志下Mysql报错
- 关于进程与线程的讲解 最最最生动的理解
- 6LoWPAN Header compression
- 野蛮愚昧的词过滤,咱是技术网站吗?
- 基于MATLAB的指纹识别算法仿真实现
- POI 导出Excel
- pptpd mysql_rhel6+pptpd+freeradius+mysql
- html5标签figure、figcaption
- Redis~集群(分布理论、一致性哈希分区、虚拟槽分区、节点握手、集群通信、集群伸缩、请求路由、故障转移、集群维护)
- 策略路由配置使用.....H3C
- 推荐9个适合Python开发的IDE。
- WPS计算机一级考试知识点,计算机一级考试WPS练习题及答案
热门文章
- MacOS Mojave 安装 AI 東北きりたん 东北切蒲英 NEUTRINO 教程
- pano2VR创建沙盘雷达设置以中心点旋转
- 斐讯K2 V22.X.X.X 新版固件 刷机教程 (开telnet,安装SSH,adbyby,刷breed,华硕Padavan)
- 聚类算法——KMeans(K-均值)
- 解决eclipse安装Darkest Dark Theme报错
- aide制作软件教程_AIDE开发教程合集
- 三菱FX系列PLC以太网连接组态王软件
- cadence SPB17.4 - export placement file to openpnp
- RAID Introduction
- android timepicker 设置颜色,android – 更改TimePicker文本颜色