Python——使用zipfile读取受密码保护的Word文档

Python——使用zipfile读取受密码保护的Word文档,python,ms-word,zipfile,Python,Ms Word,Zipfile,我正在尝试使用zipfile在Python上阅读一个受密码保护的word文档。 以下代码适用于不受密码保护的文档,但在与受密码保护的文件一起使用时出现错误 try: from xml.etree.cElementTree import XML except ImportError: from xml.etree.ElementTree import XML import zipfile psw = "1234" WORD_NAMESPACE = '{http://schema

我正在尝试使用zipfile在Python上阅读一个受密码保护的word文档。 以下代码适用于不受密码保护的文档,但在与受密码保护的文件一起使用时出现错误

try:
    from xml.etree.cElementTree import XML
except ImportError:
    from xml.etree.ElementTree import XML
import zipfile

psw = "1234"

WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
PARA = WORD_NAMESPACE + 'p'
TEXT = WORD_NAMESPACE + 't'

def get_docx_text(path):

    document = zipfile.ZipFile(path, "r")
    document.setpassword(psw)
    document.extractall()
    xml_content = document.read('word/document.xml')
    document.close()
    tree = XML(xml_content)

    paragraphs = []
    for paragraph in tree.getiterator(PARA):
        texts = [node.text
                 for node in paragraph.getiterator(TEXT)
                 if node.text]
        if texts:
            paragraphs.append(''.join(texts))

    return '\n\n'.join(paragraphs)
使用受密码保护的文件运行get_docx_text()时,我收到以下错误:

回溯(最近一次呼叫最后一次):

文件“”,第1行,在
运行文件('/Users/username/Workspace/Python/docx2txt.py',wdir='/Users/username/Workspace/Python')
文件“/Applications/Spyder-Py2.app/Contents/Resources/lib/python2.7/spyderlib/widgets/externalshell/sitecustomize.py”,第680行,在runfile中
execfile(文件名、命名空间)
文件“/Applications/Spyder-Py2.app/Contents/Resources/lib/python2.7/spyderlib/widgets/externalshell/sitecustomize.py”,执行文件第78行
execfile(文件名,*其中)
文件“/Users/username/Workspace/Python/docx2txt.py”,第41行,在
x=get_docx_text(“/Users/username/Desktop/file.docx”)
get_docx_文本中的文件“/Users/username/Workspace/Python/docx2txt.py”,第23行
document=zipfile.zipfile(路径“r”)
文件“zipfile.pyc”,第770行,在_init中__
RealGetContents中第811行的文件“zipfile.pyc”
BadZipfile:文件不是zip文件
有人有什么建议让这个代码工作吗


感谢您分享您的知识和专业技能。

我认为这不是一个加密问题,原因有二:

  • 创建
    ZipFile
    对象时,不会尝试解密。方法,例如,
    extract
    、和
    open
    、和
    read
    获取包含密码的可选
    pwd
    参数,但对象构造函数/初始值设定项没有

  • 在调用
    setpassword
    之前,当您创建
    ZipFile
    对象时,堆栈跟踪指示正在引发
    BadZipFile

  • document=zipfile.zipfile(路径“r”)
    
    我会仔细查找您正在测试的两个文件之间的其他差异:所有权、权限、安全上下文(如果您的操作系统上有这些文件的话)。。。甚至文件名差异也会导致框架“看不到”您正在处理的文件

    另外,显而易见的一点是,尝试使用与zip兼容的命令打开加密的zip文件。看看它是否真的是一个zip文件

    我通过在Python3.1中打开一个加密的zip文件来测试这一点,同时“忘记”提供密码。我可以创建
    ZipFile
    对象(下面的变量
    zfile
    ),没有任何错误,但是当我试图在不提供密码的情况下读取文件时,得到了
    运行时错误
    ——而不是
    BadZipFile
    异常:

    回溯(最近一次呼叫最后一次):
    文件“/zf.py”,第35行,在
    main()
    文件“/zf.py”,第29行,主
    打印校验和(zipfile\u名称)
    文件“/zf.py”,第22行,打印校验和
    对于校验和内容(zipfile\u名称)中的校验和:
    文件“/zf.py”,第13行,在校验和内容中
    内部文件=zfile.open(内部文件名,“r”)
    文件“/usr/lib64/python3.1/zipfile.py”,第903行,打开
    提取“%name”所需的密码
    运行时错误:文件apache.log已加密,提取时需要密码
    
    我还能够引发一个
    BadZipfile
    异常,一次是试图打开一个空文件,另一次是试图打开一些随机的日志文件文本,我已经将其重命名为“.zip”扩展名。这两个测试文件产生了相同的堆栈跟踪,一直到行号

    回溯(最近一次呼叫最后一次):
    文件“/zf.py”,第35行,在
    main()
    文件“/zf.py”,第29行,主
    打印校验和(zipfile\u名称)
    文件“/zf.py”,第22行,打印校验和
    对于校验和内容(zipfile\u名称)中的校验和:
    文件“/zf.py”,第10行,在校验和内容中
    zfile=zipfile.zipfile(zipfile_名称,“r”)
    文件“/usr/lib64/python3.1/zipfile.py”,第706行,在__
    self.\u GetContents()
    文件“/usr/lib64/python3.1/zipfile.py”,第726行,在_GetContents中
    self.\u RealGetContents()
    文件“/usr/lib64/python3.1/zipfile.py”,第738行,在RealGetContents中
    raise BadZipfile(“文件不是zip文件”)
    zipfile.BadZipfile:文件不是zip文件
    

    虽然此堆栈跟踪与您的堆栈跟踪不完全相同,但我的堆栈跟踪调用了
    \u GetContents
    ,以及
    BadZipfile
    的3.2之前的“小f”拼写,但它们非常接近,我认为这就是您正在处理的问题。

    加密的docx文件是常规(无密码保护)zip文件。加密是对zip文件的内容进行的,它不使用zip的密码保护系统。裁判谢谢你,凯文!正如你所建议的,我调查了所有权/安全问题,结果证明这就是问题所在。当我将内容复制到我制作的新MS Word文档中,并自己添加了密码时,它按预期工作。
      File "<ipython-input-15-d2783899bfe5>", line 1, in <module>
    runfile('/Users/username/Workspace/Python/docx2txt.py', wdir='/Users/username/Workspace/Python')
    
      File "/Applications/Spyder-Py2.app/Contents/Resources/lib/python2.7/spyderlib/widgets/externalshell/sitecustomize.py", line 680, in runfile
    execfile(filename, namespace)
    
      File "/Applications/Spyder-Py2.app/Contents/Resources/lib/python2.7/spyderlib/widgets/externalshell/sitecustomize.py", line 78, in execfile
    builtins.execfile(filename, *where)
    
      File "/Users/username/Workspace/Python/docx2txt.py", line 41, in <module>
    x = get_docx_text("/Users/username/Desktop/file.docx")
    
      File "/Users/username/Workspace/Python/docx2txt.py", line 23, in get_docx_text
    document = zipfile.ZipFile(path, "r")
    
      File "zipfile.pyc", line 770, in __init__
    
      File "zipfile.pyc", line 811, in _RealGetContents
    
    BadZipfile: File is not a zip file