工作起因,每学期都须要提交一个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个工作日。

这显著是个划的来的交易。

总结

语言只是工具,咱们学习的应该是思维。当接到一个新的跳战时,第一工夫应该这个跳转中的技术难点找进去,而从技术难点并解决那一刻开始,整个挑战便开始有了预期实现工夫。