专栏文章 Python 办公神器:教你使用 python 批量整理通知文件

大话性能 · 2024年04月29日 · 最后由 大话性能 回复于 2024年04月29日 · 3496 次阅读

你是否遇到过这样的情况:你有一堆 Word 文件,每个文件都包含一些重要的信息,你需要把这些信息提取出来,整理到一个 Excel 表格中,方便查阅和管理。但是,手动打开每个文件,复制粘贴信息,又太费时费力,而且容易出错。

有没有什么办法可以让 Python 帮你自动完成这个任务呢?答案是肯定的!本文将教你如何用 Python 批量提取 Word 文件中的关键信息,并写入 Excel 文件中,只需几行代码,就可以节省大量的时间和精力。

准备工作

在开始编写代码之前,我们需要先准备一些必要的工具和文件:

  • Python 环境:本文使用的是 Python 3.8,你可以在下载安装。
  • openpyxl 库:这是一个用于操作 Excel 文件的 Python 库,你可以使用pip install openpyxl命令安装。
  • python-docx 库:这是一个用于操作 Word 文件的 Python 库,你可以使用pip install python-docx命令安装。
  • glob 库:这是一个用于获取文件路径的 Python 库,一般已经内置在 Python 中,无需安装。
  • Word 文件:这是我们要提取信息的源文件,本文以 7 个会议通知文件为例,每个文件都包含学习时间、学习内容、学习形式、主持人四项关键信息,文件名分别为会议通知 1.docx,会议通知 2.docx,...,会议通知 7.docx,存放在 Notice 文件夹下。
  • Excel 文件:这是我们要写入信息的目标文件,本文以一个空白的 Excel 文件为例,文件名为 Meeting_temp.xlsx,存放在与 Notice 文件夹同一级的目录下。

获取文件路径

第一步,我们需要获取 Notice 文件夹下的所有 Word 文件的路径,这样我们才能对每个文件进行操作。这里我们可以使用 glob 库的 glob 函数,它可以根据通配符匹配文件路径,返回一个列表。例如,我们可以使用glob.glob('*.docx')来匹配当前目录下的所有以.docx 结尾的文件。

为了方便后续的操作,我们先定义一个变量 path,表示我们的工作目录,也就是 Notice 文件夹和 Excel 文件所在的目录,你可以根据实际情况修改。然后,我们使用glob.glob(path + r'\Notice\*.docx')来获取 Notice 文件夹下的所有 Word 文件的路径,保存在一个变量 files 中。注意,这里我们使用了 r 字符串,表示原始字符串,不会对反斜杠进行转义。

代码如下:

import glob

path = r'C:\Users\xxx' # 路径为Notice文件夹和Excel文件所在的目录,可按实际情况更改
files = glob.glob(path + r'\Notice\*.docx') # 获取Notice文件夹下的所有Word文件的路径
print(files) # 打印文件路径列表,检查是否正确

输出如下:

['C:\\Users\\xxx\\Notice\\会议通知1.docx', 'C:\\Users\\xxx\\Notice\\会议通知2.docx', 'C:\\Users\\xxx\\Notice\\会议通知3.docx', 'C:\\Users\\xxx\\Notice\\会议通知4.docx', 'C:\\Users\\xxx\\Notice\\会议通知5.docx', 'C:\\Users\\xxx\\Notice\\会议通知6.docx', 'C:\\Users\\xxx\\Notice\\会议通知7.docx']

解析 Word 文件

第二步,我们需要解析每个 Word 文件,获取需要的四个信息,即学习时间、学习内容、学习形式、主持人。这里我们可以使用 python-docx 库的 Document 类,它可以读取 Word 文件,并将其内容以段落(Paragraph)为单位进行划分。我们可以遍历每个段落,根据其文本内容,判断是否包含我们需要的信息,并提取出来。

为了方便后续的操作,我们先定义一个变量 number,表示序号,用于记录每个文件的顺序。然后,我们使用一个 for 循环,遍历 files 列表中的每个文件路径,使用 Document 类打开每个文件,保存在一个变量 wordfile 中。接着,我们定义一个空列表 content_lst,用于存放学习内容,因为学习内容可能分散在多个段落中,我们需要将它们合并成一个字符串。然后,我们使用一个嵌套的 for 循环,遍历 wordfile 中的每个段落,根据其文本内容,判断是否包含我们需要的信息,并提取出来,保存在相应的变量中。具体的判断逻辑如下:

  • 如果段落的文本以 “学习时间:” 开头,那么我们就提取其后面的部分,保存在一个变量 study_time 中。
  • 如果段落的文本以 “主持人:” 开头,那么我们就提取其后面的部分,保存在一个变量 host 中。
  • 如果段落的文本以 “学习形式:” 开头,那么我们就提取其后面的部分,保存在一个变量 study_type 中。
  • 如果段落的文本的长度大于等于 2,且第一个字符是数字,第二个字符是中文顿号 “、”,那么我们就认为这是学习内容的一部分,将其添加到 content_lst 中。

代码如下:

from docx import Document

number = 0 # 定义一个变量,表示序号
for file in files: # 遍历每个文件路径
    wordfile = Document(file) # 打开每个文件
    content_lst = [] # 定义一个空列表,用于存放学习内容
    for paragraph in wordfile.paragraphs: # 遍历每个段落
        if paragraph.text[0:5] == '学习时间:': # 如果段落的文本以“学习时间:”开头
            study_time = paragraph.text[5:] # 提取其后面的部分,保存在study_time中
        if paragraph.text[0:4] == '主持人:': # 如果段落的文本以“主持人:”开头
            host = paragraph.text[4:] # 提取其后面的部分,保存在host中
        if paragraph.text[0:5] == '学习形式:': # 如果段落的文本以“学习形式:”开头
            study_type = paragraph.text[5:] # 提取其后面的部分,保存在study_type中
        if len(paragraph.text) >= 2: # 如果段落的文本的长度大于等于2
            if paragraph.text[0].isdigit() and paragraph.text[1] == '、': # 如果第一个字符是数字,第二个字符是中文顿号“、”
                content_lst.append(paragraph.text) # 将其添加到content_lst中
    content = ' '.join(content_lst) # 将content_lst中的元素用空格连接成一个字符串,保存在content中
    print(study_time, content, study_type, host) # 打印提取的信息,检查是否正确

写入 Excel 文件

第三步,我们需要将提取的信息写入 Excel 文件中,这样我们就可以方便地查看和管理。这里我们可以使用 openpyxl 库的 Workbook 类和 Worksheet 类,它们可以创建和操作 Excel 文件和工作表。我们可以使用 Workbook 类的 active 属性,获取当前活动的工作表,保存在一个变量 sheet 中。然后,我们可以使用 Worksheet 类的 cell 方法,根据行号和列号,指定单元格,并给其赋值。

为了方便后续的操作,我们先定义一个变量 excel_file,表示我们要写入的 Excel 文件的路径,你可以根据实际情况修改。然后,我们使用 Workbook 类创建一个 Excel 文件对象,保存在一个变量 wb 中。接着,我们使用 wb 的 active 属性,获取当前活动的工作表,保存在一个变量 sheet 中。然后,我们使用 sheet 的 cell 方法,给第一行的每一列赋值,作为表头,分别是序号、学习时间、学习内容、学习形式、主持人。接下来,我们使用一个 for 循环,遍历 files 列表中的每个文件路径,使用 Document 类打开每个文件,保存在一个变量 wordfile 中。然后,我们使用和上一步相同的逻辑,提取每个文件中的四个信息,保存在相应的变量中。最后,我们使用 sheet 的 cell 方法,给每一行的每一列赋值,分别是序号、学习时间、学习内容、学习形式、主持人。注意,这里我们需要将序号加 1,因为第一行已经被表头占用了。最后,我们使用 wb 的 save 方法,保存 Excel 文件。

代码如下:

from openpyxl import Workbook

excel_file = path + r'\Meeting_temp.xlsx' # 定义Excel文件的路径,可按实际情况更改
wb = Workbook() # 创建一个Excel文件对象
sheet = wb.active # 获取当前活动的工作表
sheet.cell(row=1, column=1).value = '序号' # 给第一行第一列赋值,作为表头
sheet.cell(row=1, column=2).value = '学习时间' # 给第一行第二列赋值,作为表头
sheet.cell(row=1, column=3).value = '学习内容' # 给第一行第三列赋值,作为表头
sheet.cell(row=1, column=4).value = '学习形式' # 给第一行第四列赋值,作为表头
sheet.cell(row=1, column=5).value = '主持人' # 给第一行第五列赋值,作为表头
for file in files: # 遍历每个文件路径
    wordfile = Document(file) # 打开每个文件
    content_lst = [] # 定义一个空列表,用于存放学习内容
    for paragraph in wordfile.paragraphs: # 遍历每个段落
        if paragraph.text[0:5] == '学习时间:': # 如果段落的文本以“学习时间:”开头
            study_time = paragraph.text[5:] # 提取其后面的部分,保存在study_time中
        if paragraph.text[0:4] == '主持人:': # 如果段落的文本以“主持人:”开头
            host = paragraph.text[4:] # 提取其后面的部分,保存在host中
        if paragraph.text[0:5] == '学习形式:': # 如果段落的文本以“学习形式:”开头
            study_type = paragraph.text[5:] # 提取其后面的部分,保存在study_type中
        if len(paragraph.text) >= 2: # 如果段落的文本的长度大于等于2
            if paragraph.text[0].isdigit() and paragraph.text[1] == '、': # 如果第一个字符是数字,第二个字符是中文顿号“、”
                content_lst.append(paragraph.text) # 将其添加到content_lst中
    content = ' '.join(content_lst) # 将content_lst中的元素用空格连接成一个字符串,保存在content中
    number += 1 # 将序号加1
    sheet.cell(row=number+1, column=1).value = number # 给每一行第一列赋值,作为序号
    sheet.cell(row=number+1, column=2).value = study_time # 给每一行第二列赋值,作为学习时间
    sheet.cell(row=number+1, column=3).value = content # 给每一行第三列赋值,作为学习内容
    sheet.cell(row=number+1, column=4).value = study_type # 给每一行第四列赋值,作为学习形式
    sheet.cell(row=number+1, column=5).value = host # 给每一行第五列赋值,作为主持人
wb.save(excel_file) # 保存Excel文件

更多内容可以学习《测试工程师 Python 工具开发实战》书籍《大话性能测试 JMeter 实战》书籍

完成任务

至此,我们已经完成了用 Python 批量提取 Word 文件中的关键信息,并写入 Excel 文件中的任务。你可以打开 Meeting_temp.xlsx 文件,查看结果,如下图所示:

你可以看到,我们成功地将 7 个 Word 文件中的四个信息提取出来,并按照序号、学习时间、学习内容、学习形式、主持人的顺序,写入 Excel 文件中,方便查阅和管理。

总结

本文教你如何用 Python 批量提取 Word 文件中的关键信息,并写入 Excel 文件中,只需几行代码,就可以节省大量的时间和精力。本文涉及到的主要技术点有:

  • openpyxl 库:用于操作 Excel 文件,可以创建、读取、写入、修改 Excel 文件和工作表。
  • python-docx 库:用于操作 Word 文件,可以读取、写入、修改 Word 文件和段落。
  • glob 库:用于获取文件路径,可以根据通配符匹配文件路径,返回一个列表。

希望本文对你有所帮助,谢谢!

共收到 1 条回复 时间 点赞
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册