区区几行Python代码,一分钟搞定一天工作量
作者 | 陈熹、刘早起
来源 | 早起Python
大家好,我是早起。
前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下。
由于涉及文件私密所以具体内容已做脱敏处理。
大概是这样,一个文件夹下有多份会议通知信息(本文以 7 份文件为例)
每一份通知打开格式基本类似,如下所示????
现在需要将每份会议文档中的 学习时间、学习内容、学习形式、主持人 四项关键信息提取出来,整理到 Excel 表格中:
在他真实需求中,会议通知四年积累下来有快 1000 份(四年开了这么多次会也是很厉害...),用人力挨个打开文件并录到 Excel 中工作量实在太大。
好家伙,这种重复的无聊工作,不就是一份非常适合交给 Python 的自动化工作吗?
下面我们来看看如何用Python解决这个问题,主要将涉及:
openpyxl 写入 Excel 文件
python-docx 读取 Word 文件
glob 批量获取文件路径
为了简化上面的需求,本文中需要获取的会议通知文件一共 7 个,分别命名为 会议通知1.docx、会议通知2.docx... 会议通知7.docx,存放在 Notice 文件夹下。输出的目标 Excel 文件命名为Meeting_temp.xlsx
基本逻辑
写代码之前都先明确完整的问题需要分为几个小步骤实现。从需求中我们大概可以将代码分为以下几步:
获取会议通知 Notice 文件夹下的所有文件;
解析每一份 Word 文件,获取需要的四个信息,输出到 Excel 中;
保存 Excel 文件
有了逻辑就有了写代码的思路了。第 1 步可以由 glob 库完成,后面两步就是操作 Word 的 python-docx 库和操作 Excel 的 openpyxl 库的交互协作了。
这两个库我们都有说过,如果你不熟悉,一定要先阅读下面的文章!
????python-docx操作Word详解
????openpyxl操作Excel详解
代码实现
首先导入需要的库:
1from docx import Document
2from openpyxl import load_workbook
3import glob
将模板 Excel 读取进程序:
1path = r'C:\Users\xxx' # 路径为会议通知文件夹和 Excel 模板所在的位置,可按实际情况更改
2workbook = load_workbook(path + r'\Meeting_temp.xlsx')
3sheet = workbook.active写任何批处理的代码之前都建议先写一下单次操作的代码,因此我们先完成对 会议通知 1.docx 文件的解析,确保无误。现在对于文档的结构和关键信息的位置尚不明确,可以先将 Word 以段落 Paragraph 为单位输出观察:
1wordfile = Document(path + r'\Notice\会议通知 1.docx')
2for paragraph in wordfile.paragraphs:
3 print(paragraph)
文件的文字排布脉络比较清晰,基本是一句话对应一个段落,而需要的信息可以简单通过判断每句话(每段话)前几个字而明确:
1for paragraph in wordfile.paragraphs:
2 if paragraph.text[0:5] == '学习时间:':
3 study_time = paragraph.text[5:]
4 if paragraph.text[0:4] == '主持人:':
5 host = paragraph.text[4:]
6 if paragraph.text[0:5] == '学习形式:':
7 study_type = paragraph.text[5:]对于学习内容的获取比较特殊,不像其他三个信息,都在一句话中,且关键字就为前几个字:
可以看到,“学习内容” 四个字和真正包含的内容分散在不同的句子中. 这里简单用一个策略:
建立一个空列表存放,然后遍历每一段判断,如果一个字符为数字且第二个字符为中文顿号 “、” 就获取存放到列表中。最后把列表中的元素重新组合成一个长字符串即可:
1content_lst = []2 for paragraph in wordfile.paragraphs:3 if paragraph.text[0:5] == '学习时间:':4 study_time = paragraph.text[5:]5 if paragraph.text[0:4] == '主持人:':6 host = paragraph.text[4:]7 if paragraph.text[0:5] == '学习形式:':8 study_type = paragraph.text[5:]9 if len(paragraph.text) >= 2:
10 if paragraph.text[0].isdigit() and paragraph.text[1] == '、':
11 content_lst.append(paragraph.text)
12 content = ' '.join(content_lst)完成了解析 Word 文件之后,就需要把内容输出的 Excel 文件中了。
简单来说,就是将上面代码获取到的几个元素组合成一个列表,通过 sheet.append(list) 的方法写入 Excel 文件中:
1number = 0 # 全局中设置一个变量用于计数,做为序号输出23wordfile = Document(path + r'\Notice\会议通知 1.docx')4content_lst = []5for paragraph in wordfile.paragraphs:6 if paragraph.text[0:5] == '学习时间:':7 study_time = paragraph.text[5:]8 if paragraph.text[0:4] == '主持人:':9 host = paragraph.text[4:]
10 if paragraph.text[0:5] == '学习形式:':
11 study_type = paragraph.text[5:]
12 if len(paragraph.text) >= 2:
13 if paragraph.text[0].isdigit() and paragraph.text[1] == '、':
14 content_lst.append(paragraph.text)
15content = ' '.join(content_lst)
16number += 1
17sheet.append([number, study_time, content, study_type, host])单个文件解析完,用 glob 改完获取文件夹下全部文件,建立循环逐个解析就能完成本需求,当然最后记得保存 Excel 文件。
完整代码如下????
1from docx import Document2from openpyxl import load_workbook3import glob45path = r'C:\Users\xxx'6workbook = load_workbook(path + r'\Meeting_temp.xlsx')7sheet = workbook.active8number = 09
10for file in glob.glob(path + r'\Notice\*.docx'):
11 wordfile = Document(file)
12 content_lst = []
13 for paragraph in wordfile.paragraphs:
14 if paragraph.text[0:5] == '学习时间:':
15 study_time = paragraph.text[5:]
16 if paragraph.text[0:4] == '主持人:':
17 host = paragraph.text[4:]
18 if paragraph.text[0:5] == '学习形式:':
19 study_type = paragraph.text[5:]
20 if len(paragraph.text) >= 2:
21 if paragraph.text[0].isdigit() and paragraph.text[1] == '、':
22 content_lst.append(paragraph.text)
23 content = ' '.join(content_lst)
24 number += 1
25 sheet.append([number, study_time, content, study_type, host])
26
27workbook.save(path + r'\Meeting_notice.xlsx')
核心也不过三十行代码,总共不过三秒就搞定了!
如果你也想试试,可以尝试用文中的代码实现,练习数据:
https://pan.baidu.com/s/1H3x16tYAqqaEamw4fdzlrw(提取码:86vc)
更多精彩推荐
☞读懂深度迁移学习,看这文就够了 | 赠书
☞『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码
☞龙泉寺贤超法师:用 AI 为古籍经书识别、断句、翻译
☞微信十周年,腾讯晒成绩单了!
点分享点收藏点点赞点在看
相关文章:

bc计算命令的知识及企业计算案例
bc命令的用法:bc是unix下的计算器,它也可以用在命令行下面:例:给自变量i加1i2iecho $i1|bc -----效率低#因为bc支持科学计算,所以这种方法功能非常强大[rootXCN ~]# echo 11|bc 2 [rootXCN ~]# echo 1*1|bc 1 […

ExecutorService与Executors例子的简单剖析(转)
对于多线程有了一点了解之后,那么来看看java.lang.concurrent包下面的一些东西。在此之前,我们运行一个线程都是显式调用了 Thread的start()方法。我们用concurrent下面的类来实现一下线程的运行,而且这将成为以后常用的方法或者实现思路。 …

GridView隐藏列取值解决方案
【摘要】 在Asp.net 2.0中增加了一个新的数据绑定控件:GridView,其目的用来取代Asp.net1.x中的DataGrid控件,但有一点很不爽的是,如果把某列设置为visiblefalse,则不会进行数据绑定,也就是说无法直接从Grid…

百度飞桨成为北京市首个AI产业方向创新应用平台
1月20日,北京市经济和信息化局正式授予百度公司"北京市人工智能产业创新应用平台(百度飞桨)"。当前,北京市正在创建国家人工智能创新应用先导区,人工智能作为新科技革命和产业变革前沿领域,是北京…

FTP的20、21端口,工作模式
什么是FTP? FTP就是文件传输协议 File Transfer Protocol 的缩写. FTP端口号是多少? 21 FTP的端口号能改吗? 能 ftp的端口号20、21有何区别? 一个是数据端口,一个是控制端口,控制端口一般为21,而数据端口不一定是20,这和FTP的…

android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动&#…
物联网下的数据传输,Python 就能搞定!
作者 | 李秋键责编 | 夕颜出品 | AI科技大本营(ID:rgznai100)引言:近几年来,谈起发展最火热的几个关键词必然是人工智能、大数据以及物联网的万物互联、边缘计算等等了。而今天,我们就将利用Python实现物联网下的数据传…

ASP.NET 2.0中Page事件的执行顺序
Page 执行中将按照如下顺序激活事件:Page.PreInitPage.InitPage.InitComplitePage.PreLoadPage.LoadPage.LoadCompletePage.PreRenderPage.PreRenderComplete如果页面从令一个页面继承,如BasePage:System.Web.UI.Page,在BasePage中做了一些扩…

javascript函数嵌套时arguments的问题
疑问: var funtest function () {var fun function (val, val2) {alert(arguments.length); //此处答案? 有些人回答是2,但是正确是 0 };setTimeout(fun, 20);};funtest(); 转载于:https://www.cnblogs.com/huaan011/p/7073792.html

禁用页面缓存的几种方法(静态和动态)
1、在Asp页面首部<head>加入 Response.Buffer True Response.ExpiresAbsolute Now() - 1 Response.Expires 0 Response.CacheControl "no-cache" Response.AddHeader "Pragma", "No-Cache&…
程序员转型AI,成功几率有几分?
技术转型,这两年一直是程序员圈子里的热门话题。对于大部分基层程序员来说,基础岗位上薪资的涨幅很难跟上年龄的增长。而近些年,AI技术发展势头迅猛,优秀人才短缺,这种情况下,无疑是谁先转型,谁…

利用反射实现类的动态加载
为什么80%的码农都做不了架构师?>>> //首先定义一个接口来隔离类: public interface Operator { // public java.util.List act(java.util.List params);public java.util.List act(String content,String content2,java.util.List param…

spring+ (activeMQ) 实现queue与topic
2019独角兽企业重金招聘Python工程师标准>>> 2017-06-17 1、activeMQ下载与安装 前往Apache官网下载ActiveMQ,下载地址http://activemq.apache.org/download.html(此处我下载了apache-activemq-5.9.0 版本的tar包)解压:…

C#文本文件操作
如何向现有文件中添加文本using System;using System.IO;class Test {public static void Main() {// Create an instance of StreamWriter to write text to a file.// The using statement also closes the StreamWriter.using (StreamWriter sw new StreamWriter("Tes…
RISC-V 正在成为芯片世界中的 Linux
【编者按】芯片推动了人类社会数字化、信息化、智能化的发展。从某种程度上来说,芯片技术的发展也影响着行业未来的走向。你觉得未来的芯片世界将会如何?编译 | 虎说八道 责编 | 张文头图 | CSDN 下载自视觉中国出品 | CSDN(ID:C…

linux系统小记
1.当某分区空间剩余很大时,可用dd命令写入0,做成很大的文件后格式化,可当作分区使用(-o loop挂载)#dd if/dev/zero of/wq bs1M count512#mkfs -t ext3 /wq#mkswap /wq#swapon /wq#mount -o loop /wq /data#mou…

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供商 rpcServiceProvider并指定初始化方法 及 服务实例 IUserService 2. 读取 服务消费者 请求的 MethodStaics &…

Rootkit之SSDT hook(通过CR0)
SSDT即System Service Dispath Table,它是一个表,这个表中有内核调用的函数地址。KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是typedef st…

禁止validateRequest的办法
A potentially dangerous Request.Form value was detected from the client (txtTest"<b>"). 由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报错。 解决方案一: 在.a…

多画面、实时投票,这场上了一晚热搜的超级晚,背后的技术出圈了
"让观众当导演,自己决定演出顺序?" "不仅直播前台演出,还可以看到候场区明星吃火锅?" 你没听错,在各种直播、晚会频出的岁末年初,最近有一台超级晚出圈了。 1月15日,2021爱…

linux下挂载硬盘
2019独角兽企业重金招聘Python工程师标准>>> 切换到root用户 su - root 查看硬盘信息 fdisk -l Disk /dev/sda: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders Units cylinders of 16065 * 512 8225280 bytes Sector size (logical/ph…

通过创建 HttpCookie 对象的实例编写 Cookie
通过创建 HttpCookie 对象的实例编写 Cookie HttpCookie myCookie new HttpCookie("UserSettings");myCookie["Font"] "Arial";myCookie["Color"] "Blue";myCookie.Expires DateTime.Now.AddDays(1d);Response.Cookies…

亚马逊云服务(AWS)云原生自研处理器首次落地中国区域!
2021年1月28日,亚马逊云服务(AWS)正式宣布,由 AWS Graviton2 处理器提供支持的 Amazon Elastic Compute Cloud (Amazon EC2) M6g、C6g 和 R6g 实例已在由光环新网运营的 AWS 中国(北京ÿ…

一个古老的问题HashMap与Hashtable区别
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。 1.HashTable的方法是同步的&#…

如何修改可运行Jar包,如何反编译Jar包
将可运行Jar包,反编译成项目,修改代码,再次编译,打包。 需要工具:jd-gui、myeclipse 具体步骤: 1、使用jd-gui打开原始的Jar包,选择File-->Save All Sources,会生成一个zip压缩包…
告别手敲 SQL ?GPT-3 自动帮你写
作者 | Brian Kane SeekWell 编译 | 伍杏玲 出品 | AI科技大本营(ID:rgznai100) 【导语】手写业务 SQL 很繁琐?GPT-3来帮你!本文作者通过手动输入简单的英文描述秒 Get 到 SQL 了。听说 AI 又来抢开发者饭碗࿰…

Java IO 体系结构
参考文章地址: http://blog.csdn.net/oracle_microsoft/article/details/2634231 Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2.…

ACCESS数据库防止下载
1. 修改数据库名。这是常用方法,将数据库名该成怪异名字或长名字,以防别人猜测。一旦被人猜到,别人还是能下载数据库文件,但几率不大。如将数据库database.mdb改成dslfjds$^&ijjkgf.mdb等 2. 修改数据库后缀。一般改成databa…

CentOS 7 SSH 免密登录的方法
先决条件 3 台 CentOS 7 HOSTNAMEIPROLEserver110.8.26.197Masterserver210.8.26.196Slave1server310.8.26.195Slave21. 用 root 用户登录。每台服务器都生成公钥,再合并到 authorized_keys。 2. CentOS 默认没有启动 ssh 无密登录,去掉 /etc/ssh/sshd_c…

webconfig加密
退到根目录 cd/跳到某盘 c: ..跳到某目录 cd Documents and Settings/All Users上一层 cd .. cd WINDOWS/Microsoft.NET/Framework/v2.0.50727 回车 aspnet_regiis -pef connectionStrings D:/NET aspnet_regiis -pe connectionStrings -app /NET 虚拟目录aspnet_regiis -pd…