用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

Karen110
• 阅读 1646

前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下。

由于涉及文件私密所以具体内容已做脱敏处理。

大概是这样,一个文件夹下有多份会议通知信息(本文以 7 份文件为例)

用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

每一份通知打开格式基本类似,如下所示👇用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

现在需要将每份会议文档中的 学习时间、学习内容、学习形式、主持人 四项关键信息提取出来,整理到 Excel 表格中:用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

在他真实需求中,会议通知四年积累下来有快 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 库的交互协作了。

这两个库我们都有说过,如果你不熟悉,一定要先阅读下面的文章!

代码实现

首先导入需要的库:

from docx import Document  
from openpyxl import load_workbook  
import glob  

将模板 Excel 读取进程序:

path  = r'C:\Users\xxx' # 路径为会议通知文件夹和 Excel 模板所在的位置,可按实际情况更改  
workbook = load_workbook(path + r'\Meeting_temp.xlsx')  
sheet = workbook.active  

写任何批处理的代码之前都建议先写一下单次操作的代码,因此我们先完成对 会议通知 1.docx 文件的解析,确保无误。现在对于文档的结构和关键信息的位置尚不明确,可以先将 Word 以段落 Paragraph 为单位输出观察:

wordfile = Document(path + r'\Notice\会议通知 1.docx')  
for paragraph in wordfile.paragraphs:  
    print(paragraph)  

用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

文件的文字排布脉络比较清晰,基本是一句话对应一个段落,而需要的信息可以简单通过判断每句话(每段话)前几个字而明确:

 for paragraph in wordfile.paragraphs:  
        if paragraph.text[0:5] == '学习时间:':  
            study_time = paragraph.text[5:]  
        if paragraph.text[0:4] == '主持人:':  
            host = paragraph.text[4:]  
        if paragraph.text[0:5] == '学习形式:':  
            study_type = paragraph.text[5:]

对于学习内容的获取比较特殊,不像其他三个信息,都在一句话中,且关键字就为前几个字:用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

可以看到,“学习内容” 四个字和真正包含的内容分散在不同的句子中. 这里简单用一个策略:

建立一个空列表存放,然后遍历每一段判断,如果一个字符为数字且第二个字符为中文顿号 “、” 就获取存放到列表中。最后把列表中的元素重新组合成一个长字符串即可:

 content_lst = []  
    for paragraph in wordfile.paragraphs:  
        if paragraph.text[0:5] == '学习时间:':  
            study_time = paragraph.text[5:]  
        if paragraph.text[0:4] == '主持人:':  
            host = paragraph.text[4:]  
        if paragraph.text[0:5] == '学习形式:':  
            study_type = paragraph.text[5:]  
        if len(paragraph.text) >= 2:  
            if paragraph.text[0].isdigit() and paragraph.text[1] == '、':  
                content_lst.append(paragraph.text)  
    content = ' '.join(content_lst)

完成了解析 Word 文件之后,就需要把内容输出的 Excel 文件中了。

简单来说,就是将上面代码获取到的几个元素组合成一个列表,通过 sheet.append(list) 的方法写入 Excel 文件中:

number = 0 # 全局中设置一个变量用于计数,做为序号输出  

wordfile = Document(path + r'\Notice\会议通知 1.docx')  
content_lst = []  
for paragraph in wordfile.paragraphs:  
    if paragraph.text[0:5] == '学习时间:':  
        study_time = paragraph.text[5:]  
    if paragraph.text[0:4] == '主持人:':  
        host = paragraph.text[4:]  
    if paragraph.text[0:5] == '学习形式:':  
        study_type = paragraph.text[5:]  
    if len(paragraph.text) >= 2:  
        if paragraph.text[0].isdigit() and paragraph.text[1] == '、':  
            content_lst.append(paragraph.text)  
content = ' '.join(content_lst)  
number += 1  
sheet.append([number, study_time, content, study_type, host])  

单个文件解析完,用 glob 改完获取文件夹下全部文件,建立循环逐个解析就能完成本需求,当然最后记得保存 Excel 文件。

完整代码如下👇

from docx import Document  
from openpyxl import load_workbook  
import glob  

path  = r'C:\Users\xxx'  
workbook = load_workbook(path + r'\Meeting_temp.xlsx')  
sheet = workbook.active  
number = 0  

for file in glob.glob(path + r'\Notice\*.docx'):  
    wordfile = Document(file)  
    content_lst = []  
    for paragraph in wordfile.paragraphs:  
        if paragraph.text[0:5] == '学习时间:':  
            study_time = paragraph.text[5:]  
        if paragraph.text[0:4] == '主持人:':  
            host = paragraph.text[4:]  
        if paragraph.text[0:5] == '学习形式:':  
            study_type = paragraph.text[5:]  
        if len(paragraph.text) >= 2:  
            if paragraph.text[0].isdigit() and paragraph.text[1] == '、':  
                content_lst.append(paragraph.text)  
    content = ' '.join(content_lst)  
    number += 1  
    sheet.append([number, study_time, content, study_type, host])  

workbook.save(path + r'\Meeting_notice.xlsx')

用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

核心也不过三十行代码,总共不过三秒就搞定了!

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/TDXL2Cu5unH6XZgvbKxFcw,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这