使用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
相关产品推荐
相关产品推荐

