工作起因,每学期都须要提交一个DBF文件给上级部门,而这个DBF中的大多数信息都是在特定的软件中应用增加本来在excel中的数据,最初由软件生成的。
因为每年都须要弄一次,每位共事都须要弄一次,整体上会破费2 * 5 = 10人/天的工作量(运气好的话),所以决定用自动化来实现一下。
因为需要不大,又是用于特定的场合下,所以对UI没有要求。决定尝试应用(人生苦短,我用)python3来自动化一下。
装置
在macos下因为brew的加成,使其装置相干的软件都比较简单,当然了当提是咱们须要有一个还不错的网络环境。
panjie@panjies-iMac web % brew install python==> Downloading ....==> python@3.9Python has been installed as /usr/local/bin/python3Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to`python3`, `python3-config`, `pip3` etc., respectively, have been installed into /usr/local/opt/python@3.9/libexec/binYou can install Python packages with pip3 install <package>They will install into the site-package directory /usr/local/lib/python3.9/site-packagestkinter is no longer included with this formula, but it is available separately: brew install python-tk@3.9See: https://docs.brew.sh/Homebrew-and-Python
看到上述后果,就示意python装置好了。装置好后的提示信息很重要,须要认真浏览一下。比方咱们应用上述命令装置的是python3
,而后它的包管理器叫pip3
等。
如果咱们不小心遗记看相当提醒的话,其实还能够来到brew的官方网站,找到相应的包的地址,那个地址上也会有相应包装置胜利后的提醒.
这装实现后关上shell,运行phtyon3 --version
panjie@panjies-iMac web % python3 --versionPython 3.9.5
装置胜利.
应用python
应用python前我还是喜爱先下载一款得手的IDE,比方pycharm,下载后装置:
运行:
而后新建一个工程,全副抉择默认后点击实现:
点击运行,在控制台中胜利的显示了Hi PyCharm,示意Python环境胜利。
读取EXCEL
phtyon只所以广受欢迎,与其有一个十分欠缺的社区是分不开的,基本上咱们想要的都会有包的反对,所以当咱们须要读取excel表格时,首先想要的就是去搜寻是否有可用的第三方包。
而后咱们失去一个要害的信息: 应用pandas能够对excel进行操作。
装置pandas
和很多优良的包管理器一样,pip3同样提供了十分敌对的包治理性能。所以咱们想装置pandas只须要来到pip3的官方网站而后以pandas进行搜寻就能够了。
点击User Guide便进行了阐明页面,按此页面的阐明开始装置panda。
按阐明咱们执行python3 -m pip install pandas
便开始了pandas的装置:
panjie@panjies-iMac web % python3 -m pip install pandasCollecting pandas Downloading pandas-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl (11.6 MB) |███▍ | 1.2 MB 53 kB/s eta 0:03:15
实际上PIP的官方站点是 https://pypi.org/ ,在下文中将拜访该站点来查问安装包。
因为咱们是首次装置,所以包管理器中基本上什么包都没有,此时便须要急躁的期待下载。pandas以及其依赖的包全副装置实现后,将失去以下装置胜利的提醒:
Installing collected packages: six, pytz, python-dateutil, numpy, pandasSuccessfully installed numpy-1.21.2 pandas-1.3.3 python-dateutil-2.8.2 pytz-2021.1 six-1.16.0WARNING: You are using pip version 21.1.1; however, version 21.2.4 is available.You should consider upgrading via the '/usr/local/opt/python@3.9/bin/python3.9 -m pip install --upgrade pip' command.
测试
按pandas的入门文档或是轻易由网上找一些示例代码,应用pandas来读取任意的excel来测试一下:
import pandasdef test(): pandas.read_excel('/Users/panjie/sync/work/task.xlsx')if __name__ == '__main__': test()
运行后果:
ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to install openpyxl.
提醒我说须要装置openpyxl
这个模块
插曲:装置完pandas后我并没有重启pycharm,此时pycharm提醒我说没有找到pandas。此时间接尝试应用pycharm提醒中的install package间接疾速解决了找不到的问题。至于为什么会这样,没有钻研。
装置openpyxl
有了装置pandas的教训,装置openpyxl便显得非常简单了。
panjie@panjies-iMac web % python3 -m pip install openpyxl Collecting openpyxl Downloading openpyxl-3.0.8-py2.py3-none-any.whl (244 kB) |████████████████████████████████| 244 kB 926 kB/s Collecting et-xmlfile Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)Installing collected packages: et-xmlfile, openpyxlSuccessfully installed et-xmlfile-1.1.0 openpyxl-3.0.8WARNING: You are using pip version 21.1.1; however, version 21.2.4 is available.You should consider upgrading via the '/usr/local/opt/python@3.9/bin/python3.9 -m pip install --upgrade pip' command.
应用shell
装置后,pycharm依然报错。这可能是因为pycharm与shell是两个作用域吧。于是在pycharm中关上Terminal,而后持续运行python3 -m pip install openpyxl
,装置胜利后再次运行示例代码,胜利:
在减少点代码:
import pandasdef test(): xxx = pandas.read_excel('/Users/panjie/sync/work/task.xlsx') print(xxx)if __name__ == '__main__': test()
打印一下:
/Users/panjie/PycharmProjects/pythonProject/venv/bin/python /Users/panjie/PycharmProjects/pythonProject/main.py 计划打算名 计划课组 课程号 ... 备注 备注.1 类型0 软件 业余选修课 xxx ... 2~16 NaN 11 计算机 业余必修课 xxx ... 3~17 NaN 12 计算机 业余必修课 xxx ... 3~17 NaN 13 计算机 业余必修课 xxx ... 13*2+11*2 NaN 14 软件 学科平台课程 xxx ... 4~16 NaN 1
DBF读写
想解决成可用的dbf文件,则须要对应用软件生成的DBF文件进行剖析。这时候则须要一个python下能够读写dbf文件的库。
而后找到了一个名为dbfpy
的库来读写dbf库,但查看了一个最新的公布日期是2015年(它有可能只反对python2),于是报着试试看的态度来装置一下。
(venv) panjie@panjies-iMac pythonProject % python3 -m pip install dbfpyCollecting dbfpy Downloading dbfpy-2.3.1.tar.gz (19 kB)...Installing collected packages: dbfpySuccessfully installed dbfpy-2.3.1
测试
同样,咱们按官网文档的示例代码来尝试进行读库:
import pandasfrom dbfpy import dbfdef test(): xxx = pandas.read_excel('/Users/panjie/sync/work/task.xlsx') print(xxx)def testDbf(): db = dbf.Dbf("/Users/panjie/sync/work/x_kck.DBF") for rec in db: print rec printif __name__ == '__main__': testDbf()
而后运行的时候报错了:
print repr(_rec) ^SyntaxError: invalid syntax
通过查问得悉dbfpy最大仅反对在python2.7,而python3中无奈应用它。。。
于是开始转战另一个dbf库 ---- dbf,看到它最新公布的日期是2021年,总算是释怀了:
(venv) panjie@panjies-iMac pythonProject % python3 -m pip install dbf
装置胜利后找到其官网文档,进行测试:
import pandasfrom dbf import *import dbfdef test(): xxx = pandas.read_excel('/Users/panjie/sync/work/task.xlsx') print(xxx)def testDbf(): db = dbf.Table(filename='/Users/panjie/sync/work/x_kck.DBF') db.open(dbf.READ_WRITE) for record in db: print(record) db.close()if __name__ == '__main__': testDbf()
测试后果:
0 - 课程编号 : '123 ' 1 - 课程名称 : '123 ' 2 - 备注 : ' ' 3 - 简码 : ' ' 4 - 标记 : ' ' 5 - 输出人 : ' ' 6 - 输出日期 : None 7 - 审核 : ' ' 8 - 审核人 : ' ' 9 - 审核日期 : None
测试写DBF
读文件须要一行一行的来读,而写文件只须要追加记录即可:
def testDbf(): db = dbf.Table(filename='/Users/panjie/sync/work/x_kck.DBF') db.open(dbf.READ_WRITE) db.append({'课程编号': '456'}) for record in db: print(record) db.close()
上述代码,我尝试退出了456的记录,退出记录后再次打印记录值:
/Users/panjie/PycharmProjects/pythonProject/venv/bin/python /Users/panjie/PycharmProjects/pythonProject/main.py 0 - 课程编号 : '123 ' 1 - 课程名称 : '123 ' 2 - 备注 : ' ' 3 - 简码 : ' ' 4 - 标记 : ' ' 5 - 输出人 : ' ' 6 - 输出日期 : None 7 - 审核 : ' ' 8 - 审核人 : ' ' 9 - 审核日期 : None 0 - 课程编号 : '456 ' 1 - 课程名称 : ' ' 2 - 备注 : ' ' 3 - 简码 : ' ' 4 - 标记 : ' ' 5 - 输出人 : ' ' 6 - 输出日期 : None 7 - 审核 : ' ' 8 - 审核人 : ' ' 9 - 审核日期 : None
而这,正是我想要的。
收尾
解决了应用python读excel、写dbf的相干技术点后,前面的代码实现便只是逻辑性解决问题了。把代码实现后,再简略保留一份,明年的时候将10个工作日的工作缩短为1个工作日,而置信写代码的工夫应该会管制在1个工作日。
这显著是个划的来的交易。
总结
语言只是工具,咱们学习的应该是思维。当接到一个新的跳战时,第一工夫应该这个跳转中的技术难点找进去,而从技术难点并解决那一刻开始,整个挑战便开始有了预期实现工夫。