Introduction


  • 目标功能:用户输入产品系列名即可查询到相应的芯片具体型号、内核消息、Flash/RAM大小,封装类型以及工作温度。软件可方便用户进行芯片选型,无需翻找芯片选型手册。

  • 现有工具:Pycharm、芯片选型手册PDF

  • 需要用到的库:camelot-py、os、sys、json、fire

  • 实现思路

    1. 芯片选型手册中收录了MM32各个系列共7张表格,首先想到的方法是提取PDF中的这7张表格数据,再对表格数据进行查找。选用了Camelot: PDF Table Extraction for Humans,通过这个轮子,可以方便地提取PDF文件中的表格数据。Camelot具体的使用方法下面会介绍。

    2. 提取表格数据直接查找有两种实现方法: 1-1 指定表格页码,精确提取相应表格 1-2 提取所有表格,再进行查找

      方法1-1需要对每张表格指定页码,不便于后期维护。
      方法1-2每次读取PDF中的所有表格耗费时间太长。

    3. 通过Camelot将提取的表格数据转成json格式,再对json格式进行操作查找。

    4. 通过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: 产品选型小软件相关推荐

  1. python做界面小软件_PySimpleGUI图形界面绘制及办公自动化小软件的制作

    原博地址 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 如若转载,请标明出处,谢谢! 1 PySimpleGUI安装 在命令行/终端输 ...

  2. python制作mac小软件_python生成mac os app记录-py2app

    ok 软件界面设计完了  需要给软件打包成独立能运行的app.我是用了py2app. 刚开始使用pyinstaller 打包app.打包完了点击一闪就没了,花了好几天,一直没有解决.最后另起新路,选择 ...

  3. python如何开发小软件-Python程序员,如何快速开发一个小程序

    要点: 小程序是前后端分离的. 前端使用的是微信自定义的一套规范wxml+wxss+json+js,本质还是html+css+js. 后台可以选用任何你熟悉的语言:Java,Python,PHP,Ru ...

  4. python制作翻译小软件_如何基于Python制作有道翻译小工具

    这篇文章主要介绍了如何基于Python制作有道翻译小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 该工具主要是利用了爬虫,爬取web有道翻译的 ...

  5. python桌面实验小软件,实现地图信息整理为电子表格

    地图数据采集的使用: 1.选择了地区:选择地区如果只选择省份,那么则采集该省下的所有县级关键词数据:同理,如果地区选择到"市级",则采集该市下的所有县级数据. 2.关键词设置:如果 ...

  6. python制作翻译小软件_python 制作一个翻译软件

    from tkinter import * from tkinter import ttk import requests import json class Application(Tk): def ...

  7. 用Python开发了一个进销存管理的小软件

    研究生毕业之后,就进入国企工作,工作内容偏产品和售前,几乎没写过代码了,有个朋友是开游泳馆的,也会有少量商品的售卖,问我能不能给她开发一个小软件,记录商品的入库出库,统计下金额,恰好工作中今年也用到了 ...

  8. 3星|《大产品,小团队》:携程软件开发流程改进的故事

    大产品,小团队:携程敏捷技术与管理转型实战 携程集团创作,作者有产品.开发.测试.PMO等多种角色.有一点比较怪异,每个章节的作者是放在书的最后部分的. 主要内容是携程的软件开发流程改进的故事.携程的 ...

  9. 用python做一个简单GUI小软件

    用python做一个简单软件 前言 这是一个课设,用python做一个扫描王软件 我主要做的GUI部分,记录分享一下.也是第一次用python做小软件,python的方便果然是名不虚传 遇到问题 1. ...

  10. python 3.8.5 打包_python做个word转pdf的小软件

    点击上方蓝字,一起在代码的世界遨游 135编辑器 好久没更新了,因为最近学校这边事情有点多.不过这两天还是花了点时间,陆陆续续将代码和这篇文章写出来.写这个例子其实是最近需要用到几次word转为pdf ...

最新文章

  1. abb变频器acs800功率_ABB变频器如何选型(1)
  2. 解决tomcat was unable to start within问题
  3. linux -------- 使用xshell ,winscp 连接linux 以及一些问题解决
  4. Android ServiceConnection
  5. orm设置bool型 python_python基础教程之基本内置数据类型介绍
  6. 9:01 2009-7-20
  7. 开源的方舟编译器将进入深圳大学课堂
  8. 基于JAVA+SpringMVC+MYSQL的数码商城
  9. 在开启bin-log日志下Mysql报错
  10. 关于进程与线程的讲解 最最最生动的理解
  11. 6LoWPAN Header compression
  12. 野蛮愚昧的词过滤,咱是技术网站吗?
  13. 基于MATLAB的指纹识别算法仿真实现
  14. POI 导出Excel
  15. pptpd mysql_rhel6+pptpd+freeradius+mysql
  16. html5标签figure、figcaption
  17. Redis~集群(分布理论、一致性哈希分区、虚拟槽分区、节点握手、集群通信、集群伸缩、请求路由、故障转移、集群维护)
  18. 策略路由配置使用.....H3C
  19. 推荐9个适合Python开发的IDE。
  20. WPS计算机一级考试知识点,计算机一级考试WPS练习题及答案

热门文章

  1. MacOS Mojave 安装 AI 東北きりたん 东北切蒲英 NEUTRINO 教程
  2. pano2VR创建沙盘雷达设置以中心点旋转
  3. 斐讯K2 V22.X.X.X 新版固件 刷机教程 (开telnet,安装SSH,adbyby,刷breed,华硕Padavan)
  4. 聚类算法——KMeans(K-均值)
  5. 解决eclipse安装Darkest Dark Theme报错
  6. aide制作软件教程_AIDE开发教程合集
  7. 三菱FX系列PLC以太网连接组态王软件
  8. cadence SPB17.4 - export placement file to openpnp
  9. RAID Introduction
  10. android timepicker 设置颜色,android – 更改TimePicker文本颜色