目录
一、实现功能
根据关键词,对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)