从批量word文件中提取指定数据存入csv中

需求:

有一批doc格式的文件,并从中提取批量指定内容存入excel中。

首先将doc文件格式转换为docx文件

python 复制代码
#首先得安装pywin32库,此处省略


# -*- coding: utf-8 -*-
"""
Created on Tue Apr 28 15:19:24 2020
需要先安装office或者wps,自动将py文件同级文件夹下(含子文件夹)内所有的doc、xls、ppt转成docx/xlsx/pptx
已经是纯py程序,直接在python环境下运行即可,转换完成后会自动删除老版本文件。自己根据需要可调整。doc和xls文件转换时属于静默转换,ppt因为office软件原因,不支持后台静默转换,会跳出ppt软件窗口,但转换完成后会自动关闭。
原理:直接调用office相关API执行打开文件、另存为等操作,因为WPS的API兼容OFFICE,所以安装了WPS后也可以用。
@author: w
"""

import os
import logging
from win32com import client

logging.basicConfig(filename='rz.txt', level=logging.DEBUG, format='%(asctime)s-%(levelname)s-%(message)s')  # 启动日志
logging.debug("程序开始!")


def doc_to_docx(path):
    if os.path.splitext(path)[1] == ".doc":
        word = client.Dispatch('Word.Application')
        doc = word.Documents.Open(path)  # 目标路径下的文件
        doc.SaveAs(os.path.splitext(path)[0] + ".docx", 16)  # 转化后路径下的文件
        doc.Close()
        word.Quit()


def xls_to_xlsx(path):
    if os.path.splitext(path)[1] == ".xls":
        excel = client.Dispatch('Excel.Application')
        xls = excel.Workbooks.Open(path)  # 目标路径下的文件
        xls.SaveAs(os.path.splitext(path)[0] + ".xlsx", 51)  # 转化后路径下的文件
        xls.Close()
        excel.Quit()


def ppt_to_pptx(path):
    if os.path.splitext(path)[1] == ".ppt":
        powerpoint = client.Dispatch('PowerPoint.Application')
        client.gencache.EnsureDispatch('PowerPoint.Application')
        powerpoint.Visible = 1
        ppt = powerpoint.Presentations.Open(path)  # 目标路径下的文件
        ppt.SaveAs(os.path.splitext(path)[0] + ".pptx")  # 转化后路径下的文件
        ppt.Close()
        powerpoint.Quit()


def find_file(path, ext, file_list=[]):
    dir = os.listdir(path)
    for i in dir:
        i = os.path.join(path, i)
        if os.path.isdir(i):
            find_file(i, ext, file_list)
        else:
            if ext == os.path.splitext(i)[1]:
                file_list.append(i)
    return file_list


# 获取当前py文件所在路径
dir_path = os.path.split(os.path.realpath(__file__))[0]
# print(dir_path)
# os._exit()
#dir_path = "D:\我的文档\桌面\附件1文件" #批量转换文件夹

dir_path=r'D:\develop\Python\extract_score\score2'

ext = ".doc"
file_list = find_file(dir_path, ext)
for file in file_list:
    try:
        doc_to_docx(file)
        logging.debug(file)
        os.remove(file)
    except Exception as bcnr:
        logging.debug("可接受异常:%s(一般是磁盘缓存未能及时更新导致)" % bcnr)
# print(file_list)

ext = ".xls"
file_list = find_file(dir_path, ext)
for file in file_list:
    try:
        xls_to_xlsx(file)
        logging.debug(file)
        os.remove(file)
    except Exception as bcnr:
        logging.debug("可接受异常:%s(一般是磁盘缓存未能及时更新导致)" % bcnr)

# print(file_list)

ext = ".ppt"
file_list = find_file(dir_path, ext)
for file in file_list:
    try:
        ppt_to_pptx(file)
        logging.debug(file)
        os.remove(file)
    except Exception as bcnr:
        logging.debug("可接受异常:%s(一般是磁盘缓存未能及时更新导致)" % bcnr)
# print(file_list)

参考地址:自动批量一次性转换工具,doc转docx,xls转xlsx,ppt转pptx,基于python_doc批量转docx-CSDN博客

然后读取docx文件中的指定内容

python 复制代码
import docx
import os
import csv as csv

# 加载Word文档
# doc = docx.Document('a.docx')

# 存储提取的内容
contacts = []

path = "D:\\develop\\Python\\extract_score\\score1\\"

allItems = os.listdir(path)

# 新打开一个 info3.CSV 文件

fo = open("info3.csv", "w", newline='')

# 将表头存储在一个列表中

header = []
cols = 39
for i in range(cols):
    header.append(f"id{i}")

# 创建一个 DictWriter 对象,第二个参数就是上面创建的表头

writer = csv.DictWriter(fo, header)

# 将小刚的记录插入到row_list 中
row_list = []
j = 0
for item in allItems:
    doc = docx.Document(path+item.title())
    # 遍历文档中的段落并提取联系人关键字对应的内容
    for paragraph in doc.paragraphs:
        if '学生姓名:' in paragraph.text:
            # 获取关键字后面的内容
            contact = paragraph.text.split('学生姓名:', 1)[1]
            contacts.append(contact.strip())
        if '实际得分:' in paragraph.text:
            # 获取关键字后面的内容
            contact = paragraph.text.split('实际得分:', 1)[1]
            contacts.append(contact.strip().replace("分", ''))
    # 显示提取的内容
    print(contacts)
    dict = {}
    for i in range(cols):
        print(contact)
        dict[f"id{i}"] = contacts[j+i]
    j += cols
    row_list.append(dict)

# 调用 writerows 方法,一次性写多个字典(一个字典列表)到 CSV 文件中
writer = csv.DictWriter(fo, header)

# 写表头
writer.writeheader()

# 调用 writerows 方法,一次性写多个字典(一个字典列表)到 CSV 文件中

writer.writerows(row_list)


# 关闭文件

fo.close()

参考地址:快乐学Python,使用Python将数据写入CSV文件中_python写csv文件-CSDN博客

相关推荐
Z21161334717 分钟前
学习日志011--模块,迭代器与生成器,正则表达式
python
CrazyCosin22 分钟前
Clip结合Faiss+Flask简易版文搜图服务
python·flask·faiss
Envyᥫᩣ37 分钟前
掌握C#中的异步编程:async和await关键字详解
开发语言·c#
sukalot1 小时前
windows C#-查询表达式基础(三)
开发语言·windows·c#
恒风52121 小时前
PyCharm 中的【控制台】和【终端】的区别
ide·python·pycharm
JavaPub-rodert1 小时前
Windows系统下载、安装和配置Python环境变量 --- 《跟着小王学Python》
开发语言·windows·python
大新新大浩浩2 小时前
使用docker-compose单点搭建社区版seafile+onlyoffice在线word编辑平台
docker·容器·word
十夫长2 小时前
Java poi 模板导出Word 带图片
java·word·poi·图片·模板
小奥超人2 小时前
word技巧:选择题的ABCD选项如何对齐?
windows·经验分享·microsoft·word·办公技巧
JAMES费2 小时前
python机器人Agent编程——多Agent框架的底层逻辑(上)
开发语言·python·机器人