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

使用python-docx读取单个docx文件失败的技术求助

解决DOCX文件读取的PackageNotFoundError问题

问题背景

现有代码可读取DOCX、PDF、TXT文件,但针对特定DOCX文件(input_customTemplate.docx)读取时抛出错误:

docx.opc.exceptions.PackageNotFoundError: Package not found at 'C:\Users\hp\Desktop\Projects\PatentGenie\temp\234\custom_template\~$put_customTemplate.docx'

已确认:

  • 执行期间未打开该文件
  • 其他DOCX文件读取正常
  • 复制目录、修改文件内容、另存为新文件均无法解决问题

错误原因

代码遍历目录时可能未过滤Word临时文件(以~$开头),导致这类无效文件被传入读取逻辑。尽管read_file函数有临时文件判断,但存在路径校验不严谨的情况,使得无效文件进入read_docx函数,而临时文件并非有效的DOCX包,引发异常。

解决方案

1. 遍历目录时提前过滤临时文件

在调用read_file前,直接排除~$开头的文件,从源头避免无效文件进入处理流程:

import os

folder_path = "your_target_folder"
patent_name = "custom_template"

patent_dir = os.path.join(folder_path, patent_name)
for file_name in os.listdir(patent_dir):
    # 跳过临时文件和非目标格式文件
    if file_name.startswith('~$'):
        continue
    if not file_name.endswith(('.docx', '.pdf', '.txt')):
        continue
    # 处理有效文件
    content = read_file(folder_path, patent_name, file_name)
    print(content)

2. 增强read_file的路径校验逻辑

增加文件有效性校验,避免处理目录或不存在的文件:

def read_file(folder_path, patent_name=None, file_name=None):
    if file_name:
        file_path = os.path.join(folder_path, patent_name, file_name)
    elif patent_name:
        file_path = os.path.join(folder_path, patent_name)
    else:
        file_path = os.path.join(folder_path)

    # 跳过临时文件
    if os.path.basename(file_path).startswith('~$'):
        return "Skipping temporary file."
    
    # 校验是否为有效文件
    if not os.path.isfile(file_path):
        return f"Invalid file path: {file_path}"
    
    if file_path.endswith('.docx'):
        return read_docx(file_path)
    elif file_path.endswith('.pdf'):
        return read_pdf(file_path)
    elif file_path.endswith('.txt'):
        return read_txt(file_path)
    else:
        raise ValueError("Unsupported file format")

3. 明确捕获DOCX包异常

在read_docx中单独捕获PackageNotFoundError,确保错误处理更精准:

from docx import Document
from docx.opc.exceptions import PackageNotFoundError

def read_docx(file_path):
    try:
        doc = Document(file_path)
        content = [paragraph.text for paragraph in doc.paragraphs]
        return '\n'.join(content)
    except PackageNotFoundError as e:
        return f"Invalid DOCX file: {e}"
    except Exception as e:
        return f"Error reading DOCX file: {e}"

4. 清理残留临时文件

手动检查目标目录,删除所有~$开头的残留文件(Word异常退出可能遗留这类文件)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:05:22