victory的博客

长安一片月,万户捣衣声

0%

python-docx | Python检查word文件中的特殊标记词是否与文件名中的一致

Python检查word文件中的特殊标记词是否与文件名中的一致

公司的部分文件分为“内部”和“外部”。正常情况下,这个标识在文件名及文件首页左上角都有标注。然鹅,有时候操作一下,忘记改了,或者忘记标注了。就需要回头去一个一个地整理,非常麻烦。这种重复的,繁杂的操作,尽快冲Python来,人类还是应该多做做其它更有意思的事。

代码:

import os
from win32com import client as wc  # 导入模块
import docx
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体

# 将文件夹内的所有doc转存为docx文件
path = os.getcwd() + "\\文件\\"  # 文件夹绝对路径
files = []
for file in os.listdir(path):
    if file.endswith(".doc"):  # 排除文件夹内的其他干扰文件,只获取".doc"后缀的word文件
        files.append(path+file)

word = wc.Dispatch("Word.Application")  # 打开word应用程序
for file in files:
    doc = word.Document(file)  # 打开word文件
    doc.SaveAs("{}x".format(file), 12)  # 另存为后缀为".docx"的文件,其中参数12指docx文件
    doc.Close()  # 关闭原来word文件
word.Quit()

for file in files:  # 删除doc文件
    os.remove(file)

# 获取所有docx文件路径
docx_files = []
for file in os.listdir(path):  # 排除文件夹内的其它干扰文件,只获取".doc"后缀的word文件
    if file.endswith(".docx"):
        docx_files.append(path+file)

counter = 0  # 计数器,用于记录有多少文件没被处理

for file in docx_files:
    file_head = file.split('.')[0].rstrip()  # 文件名头,类似这样的“C:\\Users\\文件\\测试”
    file_tail = file.split('\\')[-1]  # 文件名尾,类似这样“测试.docx”
    mark_words = ["公开", "内部"]
    mark_fileName = file_head[-3:-1]  # 文件名中倒数第2,3个文字

    doc = docx.Document(file)
    mark_doc = doc.paragraphs[0].text  # 文件中首段文字
    # 比对标记词
    if mark_doc in mark_words:  # 判断文件中有无标记
        if mark_fileName in mark_words:  # 判断文件名中有无标记
            if mark_doc == mark_fileName:  # 如果二者标记相同
                counter += 1
                pass
            else:  # 二者标记不同
                os.rename(file, file.replace(mark_fileName, mark_doc))  # 重命名文件
                print(f"【{file_tail}】文件名重命名标识为【{mark_doc}】")
        else:
            os.rename(file, f"{file_head}({mark_doc}).docx")  # 文件名中无标记,则加标记
            print(f"【{file_tail}】文件名增加标识为【{mark_doc}】")
    else:
        # 文中无标记,则在首段前插入一段,写入标记
        p = doc.paragraphs[0]
        pNew = p.insert_paragraph_before()
        run = pNew.add_run(mark_words[0])  # 写为“公开”
        # 字体设置
        run.font.size = Pt(16)
        run.font.name = "黑体"
        r = run._element.rPr.rFonts
        r.set(qn("w:eastAsia"), "黑体")

        doc.save(file)
        print(f"【{file_tail}】内容增加标识为【{mark_words[0]}】")

        if mark_fileName in mark_words:  # 查看文件名中是否有标记
            if mark_fileName == mark_words[0]:  # 标记是否为“公开”
                pass
            else:  # 标记不是“公开”则替换
                os.rename(file, file.replace(mark_fileName, mark_words[0]))  # 重命名文件
                print(f"【{file_tail}】文件名重命名标识为【{mark_words[0]}】")
        else:
            os.rename(file, f"{file_head}({mark_words[0]}).docx")  # 文件名中无标记,则加标记
            print(f"【{file_tail}】文件名增加标识为【{mark_words[0]}】")

print(f"完成!共检查{len(docx_files)}个文件,处理了 {len(docx_files) - counter} 个文件。")