python按内容检索doc及docx文档文件(python练手项目)

目录

一、实现功能

二、前期准备

三、具体实现


一、实现功能

根据关键词,对doc、docx文档的文本及表格内容进行模糊匹配查找。

使用语言:python,使用包:python-docx、loguru、win32com等。

二、前期准备

(一)安装包,下载很慢的话可使用清华源,使用方式见官方文档: pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

   pip install pypiwin32
   pip install loguru
   pip install python-docx

(二)主要业务逻辑伪代码

    list_file(root_path) #遍历根目录下的所有doc,docx文件
    doc2docx(file_path) #因为doc文件操作包很不好用,故将所有doc文件另存为docx文件
    read_docx_file(file_path,key_words) #读取docx文件,传入关键词,进行匹配查找,查询结果输出至txt文件

下面根据伪代码分别实现函数

三、具体实现

(一)设置日志

    from loguru import logger
    logger.add("log/info.log", rotation="10MB", level='INFO')    #参数分别为存储路径、单个文件达到10MB后对文件进行分割存储
                                                                 #日志级别
    logger.add("log/warning.log", rotation="10MB", level='WARNING')
    logger.add("log/error.log", rotation="10MB", level='ERROR')

(二)遍历doc并另存为docx,因为doc文件操作包很不好用,故将所有doc文件另存为docx文件(我电脑里有wps,所以使用了wps客户端)

def doc2docx(path):
    #单个doc文件另存为docx
    # w = win32com.client.Dispatch('Word.Application')  # Word客户端
    w = win32com.client.Dispatch('kwps.Application')  # wps客户端
    w.Visible = False  # wps客户端是否拉起界面
    # w.DisplayAlerts = false #word客户端是否拉起界面
    doc = w.Documents.Open(path)
    newpath = os.path.splitext(path)[0] + 'docx.docx'  #新路径
    doc.SaveAs(newpath, 12, False, "", True, "", False, False, False, False)  # 另存为docx文件
    doc.Close()
    w.Quit()
    return newpath

def save_doc_to_docx(root_path):
    # 全部另存为docx
    for current_path, dirs, files in os.walk(root_path):  # 返回迭代对象,每个对象内为当前路径,当前路径下的目录,当前目录下的文件
        for file in files:
            if file.endswith('.doc'):
                absolute_path = os.path.join(current_path, file)
                newpath = doc2docx(absolute_path)
                logger.info(f"浏览{absolute_path}文件")
                logger.info(f"另存为{newpath}文件")

(三)遍历所有docx文件,并作为待执行任务写入txt

def list_docx(root_path):
    jobs = []
    for current_path, dirs, files in os.walk(root_path):
        for file in files:
            if file.endswith('.docx'):
                absolute_path = os.path.join(current_path, file)
                logger.info(f"浏览{absolute_path}文件")
                jobs.append(absolute_path)
    if not os.path.exists('output'):
        os.mkdir("output")
    with open("output/jobs.txt", 'w', encoding='utf-8') as f:
        for job in jobs:
            f.write(job + "\n")
    logger.info("遍历docx文件,写入jobs")
    return jobs

(四)根据关键词,进行匹配查找,写入结果res.txt(docx包读取经常会遇到不可预知的错误,需进行异常处理)

def read_docx_file(path, key_words):
    res = []
    exec = []
    if not os.path.exists("output/jobs.txt"):
        jobs = list_docx(path)                   #不存在创建jobs
        logger.info("遍历docx文件,创建jobs")
    else:
        with open("output/jobs.txt", 'r', encoding='utf-8') as f:
            jobs = f.read().splitlines()               #存在就读取jobs,如需重新遍历,删除jobs即可
        logger.info("读取jobs文件")
    logger.info("--读取docx文件--")
    for job in jobs: #发生异常,仅记录日志,跳过该docx文件继续处理
        try:  
            logger.info(f"读取{job}文件")
            doc = Document(job)
            ps = doc.paragraphs
            ts = doc.tables
            for p in ps:
                one_p = p.text
                if any(key_word in one_p for key_word in key_words):
                    res.append(job)
                    # 读取到即放弃该word,跳出循环
                    break
            is_table_match = False
            for t in ts:
                for one_row in t.rows:
                    for one_cell in one_row.cells:
                        one_cell_text = one_cell.text.strip()
                        if any(key_word in one_cell_text for key_word in key_words):
                            res.append(job)
                            is_table_match = True
                            # 读取到即放弃该word,跳出循环
                            break
                    if is_table_match:
                        break
                if is_table_match:
                    break
            exec.append(job)
            logger.info(f"读取{job}文件结束")
        except Exception as e:
            logger.error(f"{job}发生错误,读取失败,请检查原因!")
            logger.error(e)
    with open("output/exec.txt", 'w', encoding='utf-8') as f:
        for z in exec:
            f.write(z + "    执行完毕!   \n")
    with open("output/res.txt", "w", encoding='utf-8') as f:
        for one_file in res:
            f.write(one_file + "\n")

(五)执行

if __name__ == '__main__':
    logger.add("log/info.log", rotation="10MB", level='INFO')
    logger.add("log/warning.log", rotation="10MB", level='WARNING')
    logger.add("log/error.log", rotation="10MB", level='ERROR')
    # 开始主程序
    root_dir = 'D:\原神'
    key_words = ['mihayou']
    save_doc_to_docx(root_dir)
    read_docx_file(root_dir, key_words)
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值