我正在尝试使用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>
我想做的是从标题中提取文本
答案 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):
...