如何检测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
相关产品推荐
相关产品推荐

