python从word docx读取标头

时间:2019-12-12 15:11:37

标签: python ms-word python-docx python-watchdog

我正在尝试使用python-docx和watchdog从Word文档中读取标题。 我正在做的是,无论何时创建或修改新文件,脚本都会读取该文件并获取标题中的内容,但是我得到了

docx.opc.exceptions.PackageNotFoundError: Package not found at 'Test6.docx'

错误,我尝试了所有操作,包括将其作为流打开,但没有任何效果,是的,该文档已填充。 供参考,这是我的代码。

**main.py**
    import time
    from watchdog.observers import Observer
    from watchdog.events import FileSystemEventHandler
    import watchdog.observers
    import watchdog.events
    import os
    import re
    import xml.dom.minidom
    import zipfile
    from docx import Document


    class Watcher:
        DIRECTORY_TO_WATCH = "/path/to/my/directory"

        def __init__(self):
            self.observer = Observer()

        def run(self):
            event_handler = Handler()
            self.observer.schedule(event_handler,path='C:/Users/abdsak11/OneDrive - Lärande', recursive=True)
            self.observer.start()
            try:
                while True:
                    time.sleep(5)
            except:
                self.observer.stop()
                print ("Error")

            self.observer.join()


    class Handler(FileSystemEventHandler):

        @staticmethod
        def on_any_event(event):
            if event.is_directory:
                return None

            elif event.event_type == 'created':
                # Take any action here when a file is first created.
                path = event.src_path
                extenstion = '.docx'
                base = os.path.basename(path)

                if extenstion in path:
                    print ("Received created event - %s." % event.src_path)
                    time.sleep(10)
                    print(base)
                    doc = Document(base)
                    print(doc)
                    section = doc.sections[0]
                    header = section.header
                    print (header)



            elif event.event_type == 'modified':
                # Taken any action here when a file is modified.
                path = event.src_path
                extenstion = '.docx'
                base = os.path.basename(path)
                if extenstion in base:
                    print ("Received modified event - %s." % event.src_path)
                    time.sleep(10)
                    print(base)
                    doc = Document(base)
                    print(doc)
                    section = doc.sections[0]
                    header = section.header
                    print (header)



    if __name__ == '__main__':
        w = Watcher()
        w.run()

编辑: 试图将扩展名从doc更改为docx,并且可行,但是无论如何都可以打开docx,因为那就是我所发现的。

另一件事。当打开“ .doc”文件并尝试读取标题时,我得到的只是

<docx.document.Document object at 0x03195488>
<docx.section._Header object at 0x0319C088>

我想做的是从标题中提取文本

1 个答案:

答案 0 :(得分:1)

您正在尝试打印对象本身,但是您应该访问其属性:

...
doc = Document(base)
section = doc.sections[0]
header = section.header
print(header.paragraphs[0].text)

根据https://python-docx.readthedocs.io/en/latest/user/hdrftr.html

更新

当我使用 python-docx 软件包时,结果发现PackageNotFoundError非常通用,因为它可能仅由于文件由于某种原因无法访问-不存在,找不到或由于权限而发生,以及文件为空或已损坏。例如,对于看门狗来说,很可能发生在触发“创建”事件之后和创建 Document 文件之前,可以重命名,删除文件等的原因。由于某种原因,您使这种情况更有可能发生通过等待10秒才能创建文档?因此,请尝试检查以下文件是否存在:

if not os.path.exists(base):
    raise OSError('{}: file does not exist!'.format(base))
doc = Document(base)

UPDATE2

还请注意,当打开程序基于文件名创建一些锁定文件时可能会发生这种情况,例如在Linux上运行代码并使用libreoffice打开文件会导致

PackageNotFoundError: Package not found at '.~lock.xxx.docx#'

因为该文件不是docx文件!因此,您应该使用

更新过滤条件
if path.endswith(extenstion):
...