人生苦短,快学Python!
今天分享一位零基础读者朋友的真实学习心得,希望能帮到大家快速入门Python自动化办公!——本文作者:浩子
本文开头,再一次感谢《快学Python:自动化办公轻松实战(以下简称“《快学Python》”)的2位作者朱小五和黄伟老师享以及耐心指导,才能让我得以真正用好Python这一把利器,灵活高效解决工作上的实际问题!
我们也希望更多的读者能学通学透本书的各个案例,并且举一反三,灵活将所学知识运用到更多的工作场景中,从繁琐的复制粘贴等复杂机械工作中解放出来,得以集中精力专注研究更深层次的问题以及课题,取得更加丰硕的工作成果!
一、学习Python语言的动机
在学习Python语言之前,笔者已经初步了解OFFICE的基本功能(包括WORD邮件合并等基本功能、EXCEL的VLOOKUP等基本函数等)以及SQL语言(SELECT、FROM、WHERE、JOIN的基本用法);
但随着工作内容的日趋复杂以及涉及数据量的日益庞大,笔者逐渐感觉需要更加简洁高效的数据分析处理工具,才能更好更快地解决工作上的难题;
因此,学习Python语言成为了自然而然的选择。受时间限制,职场人士系统全面学习知识并不现实,需要更加贴近工作场景、“干货”程度更高的学习材料;
因此,笔者选择了《快学Python》一书,该书特色之一就是“更多实战案例,助力新手快速上手Python编程”。
二、需求提出:
完成某项工作,需要实现什么功能
笔者每月都要对集团辖内30多家子公司编写经营情况报告,报告开头都要编写基本情况,如图1(相关内容已经进行简化及脱敏,但不影响实际需求分析):
图1:日常工作经常需要编写报告的基本样式
以往要编写上述部分内容,主要是从EXCEL报表中手工复制数据到WORD报告;后来采取WORD的邮件合并功能,但每一次编写报告都要执行一次,而且由于邮件合并结果在同一个WORD文档里,操作执行结束后仍然需要手工拆分成多个文档;实际非常繁琐复杂。
图2:WORD环境下的邮件合并操作
事实上,笔者的上述工作场景,要实现的功能就是:“建立数据‘仓库’(截止时点、开始时点、子公司名称、截止时点以及开始时点经营收入数据)-〉数据从‘仓库’中‘出货’-〉‘ 移植’到报告模版-〉每一组数据生成一个独立的文件”。
以笔者工作数据为例,C:UsersAdministratorDesktopEXCEL
数据导入WORD文件夹里有一个1S.docx文件,一个1S.xlsx文件。
图3:原始数据所在文件夹
图4:1S.docx
这就是待“移植”导入数据的报告模版,“****”就是“移植”的目标位置
图5:1S.xlsx,这就是数据“仓库”
三、实现功能
将EXCEL数据“移植”至WORD文档
笔者参照《快学Python》第五章“批量制作缴费通知单”(P207-P210)部分,编写了代码,如图6,原代码详见文末下载。
图6:代码1
(具体代码原理本文不作详解,建议读者详细学习P180-P184“读取Word文档中的文字内容”,深刻理解段落、标题、正文、文字块在Python操作Word过程中的含义,才能准确找到文字块的具体值、位置,再结合P207-P210的具体代码,才能编写准确;此外,读者还应理解P17-P18的索引相关知识,并牢牢紧记:Python的所有东西,都是从“0”开始算起的,具体见书本图1-30)
运行代码1后,新形成2个WORD文件,就是我们所需要的“移植”后的文档,而且数据与“仓库”的一致。
图7:移植后新形成的文件(可对比图3至图5)
【“警告”】 《快学Python》P13已经告诉我们:“与大多数编程语言不同,Python采取相同的缩进来表示代码块。”言下之意,如果我们在编代码过程不注意缩进的规范(在代码开头前面打多或打少一两个空格),很可能代码块的混乱甚至逻辑错误,造成编码失败(这与我们使用WORD文档时长期形成的认识也是矛盾的,毕竟WORD段落缩进的不一致通常只会造成美观上的问题,不会造成我们阅读时的歧义;因此“采取相同的缩进来表示代码块”的要求需要我们在编程实践中不断体会、领悟、掌握)。
图8:你发现这段失败的代码与图6成功的代码有什么不同吗?错在哪里?如何纠正?(建议再深刻学习P13、P62的内容)
四、优化功能
如何实现增加用户图形界面
虽然在前面已经成功编写了代码,但似乎离我们日常看得见摸得着的程序窗口界面还有十万八千里;
所以笔者本着编写程序窗口界面的目的,又学习了第十二章“Python图形界面开发” (P366)部分,并参照编写了一个自定义函数,将上述代码“封装”起来,原代码详见附件代码2之1。注意:本书P366样例的主函数中只有1个参数,但笔者写的主函数需要2个参数(导入WORD文档、EXCEL文档共2个文件),所以写的时候还是有点不踏实的,好在运行时没有差错(注:这时的运行代码只能检查代码有无基本错误问题,因为未导入文档,无法看到结果)。
图9:主函数代码
(与书本代码不同点有以下:一是主函数main有path1、path2共2个参数;二是保存文件名写为"{rows[0]}基本情况表20221007.docx"
,可参考P24“1.5.3 字符串格式化的3种方式”;三是WORD文档保存的最后一句代码应写为doc.save(path_new)”
,不能画蛇添足地照抄书本代码加上index=False
否则又会出错)
图10:画蛇添足照抄书本代码加上index=False的错误结果
在此基础之上,又学习了第十二章的“Python图形界面开发”P366-P367相关内容,编写代码生成可视化的与我们日常认知吻合的程序界面(大多数读者看见的程序,都是有对话框的吧)。注意:本书P367样例的代码只是形成了1个输入框,笔者也是依样画葫芦写多了1段输入框的代码(感兴趣的可对比书本代码以及附件代码2之2),好在运行也出现了期待已久的窗口界面。
图11:图形界面的代码
(与书本代码不同点有以下:一是增加了1个输入框的代码、即多了1组sg.textsg.Inputsg.FileBrowse,从界面上来看也是多了1个输入框;二是在if values以及main()增加了1个参数。上述增加的代码部分也是在朱小五老师指导下完成的,再次感谢!
图12:作者朱小五老师半夜在读者群秒回答疑
不过图形界面代码还未有与此前的核心代码连接起来,因此这个窗口还只是一个空壳,没有办法达到既定效果的。点击“开始工作!”是不会工作的、也不会生成我们想要的WORD文档的。而错误提示也很清楚:name’main’is not defined(未连接上main函数,因此会提示“未定义”,可参阅P59-P68的Python异常处理)
图13:单纯的图形界面代码是无法运行的
因此,我们要把代码2之1以及代码2之2一并写入一个代码框,测试运行结果是成功的:
图14:运行结果成功
图15:在目标文件夹查看新生成文件,数据与预期一致
如果要将上述得到有用户图形界面的程序代码打包成为一个EXE程序,方便其他同事使用,可参阅P370-P374的相关内容。
五、本次学习总结
平心而论,本次分享的学习成果相对浅显简单,但“麻雀虽小,五脏俱全”,实现了从实际工作需求出发、分析需求、编写核心代码、增加图形界面、生成可执行程序的基本流程。
职场人学习Python以及其他数据分析语句工具,应紧紧围绕自己工作实际,将日常各种具体而繁琐的工作流程,努力提炼成“某项工作需要实现什么功能-〉实现这项功能需要获取什么数据-〉如何获取相应数据-〉如何实现数据与数据之间、数据与文件之间的互联互通、无缝连接”的抽象化思路;
对书中案例的代码(笔者比较喜欢先直接学习每一章的“案例”以及“实战项目”部分,看不懂就再回过头来看对应代码的“语法”解释或者百度搜索),一要坚持亲自手敲几遍(单纯眼看代码与亲自手打代码是完全不同的境界),亲自运行,才能体会到相应的代码可以产生什么样的效果,才能知道该如何“避坑”(如本次分享的图8,更加可以体会到Python这种打多打少一个空格都会完全不一样的语言,有不少新手容易踩的“坑”);
二是要坚持举一反三,对书上代码不要局限于照抄照搬(但“抄作业”也是第一个必不可少的阶段!),更加要多思考如何让代码实现更多一点的功能、如何完全实现实际工作所需要的功能(如本次分享的图9、图11相关代码),在此基础之上大胆编写代码,出了错误提示也不要怕,慢慢查百度、查书上解释,往往很容易得到解决;在实际学习中,“出错-〉纠错-〉提高”往往是实现快速进步的捷径。