You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测Word文档是否加密?Python读取Word遇加密文件处理方法

检测Word文档是否加密并跳过打开

方法1:用win32com的参数捕获异常

你现在用的代码会弹出密码对话框,是因为没指定密码参数,Word默认会弹框索要密码。给Documents.Open加个PasswordDocument参数,设成空字符串,要是文档需要密码,就直接抛出异常不会弹框,捕获这个异常就能判断文档需要密码,直接跳过处理即可。

修改后的代码示例:

import win32com.client

word = win32com.client.gencache.EnsureDispatch('Word.Application')
word.Visible = False  # 后台运行,避免弹出Word窗口干扰
file_path = r"D:\appointment\PasswordProtectedDoc.doc"

try:
    # 传入空密码,加密文档会直接抛出异常
    doc = word.Documents.Open(FileName=file_path, PasswordDocument="")
    # 能执行到这里说明文档无密码,可正常处理
    print(f"{file_path} 无密码,可正常读取")
    doc.Close()
except Exception:
    # 捕获到异常则说明文档需要密码,跳过处理
    print(f"{file_path} 需要密码,跳过")
finally:
    word.Quit()

方法2:直接解析文档(适合批量检测,无需启动Word)

针对.docx格式的文档,未加密的本质是压缩包,加密的文档会被包装成OLE文件。可以用olefile库直接判断,不用依赖Word客户端,适合批量扫描文件。

先安装依赖:

pip install olefile

检测代码:

import olefile
from zipfile import ZipFile

def is_doc_protected(file_path):
    # 先判断是否为OLE格式(加密docx或老版doc)
    if olefile.isOleFile(file_path):
        with olefile.OleFileIO(file_path) as ole:
            # 加密文档会包含EncryptionInfo流,或缺少正常的CompObj标识
            return "EncryptionInfo" in ole.listdir() or "\x01CompObj" not in ole.listdir()
    else:
        # 非OLE文件,按普通docx(zip)检查,加密文档无法正常解压
        try:
            with ZipFile(file_path) as zf:
                zf.testzip()
            return False
        except:
            return True

# 使用示例
if is_doc_protected(r"D:\appointment\PasswordProtectedDoc.docx"):
    print("文档已加密,跳过处理")
else:
    print("文档无密码,可正常处理")

注意:这个方法对老版.doc文件的判断准确性不如第一种方法,优先推荐使用方法1。

内容的提问来源于stack exchange,提问作者WhoamI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:40:17