zipfile.ZipFile提取异常:解压新压缩包仍返回旧文档内容
问题排查与解决方案
核心问题原因
- 路径不匹配是首要诱因,代码中所有文件路径没有保持统一:
- 生成zip文件时写入路径为
data/zip/document.zip,但读取zip时使用的是相对路径zip/document.zip,实际读取的是其他目录下留存的旧zip文件,而非新生成的zip - 解压目标路径为
data/extracted/,但后续重命名、读取文件时使用的路径为extracted/xxx,实际访问的是旧运行过程中生成的残留文件
- 生成zip文件时写入路径为
- 没有清理旧运行残留:每次解压前没有清空
data/extracted目录,旧文件不会被新解压的文件覆盖,就会出现“未运行转txt代码也会出现document.txt”的现象 - Jupyter 运行态缓存:Jupyter 内核会留存之前的运行状态,未重启内核时之前的操作残留会持续生效
修复方案
修正后的完整代码
import os import shutil import zipfile # 自定义路径常量,统一管理避免写错 BASE_DATA_PATH = "data" DOCX_PATH = os.path.join(BASE_DATA_PATH, "docx/input.docx") ZIP_PATH = os.path.join(BASE_DATA_PATH, "zip/document.zip") EXTRACTED_PATH = os.path.join(BASE_DATA_PATH, "extracted") XML_PATH = os.path.join(EXTRACTED_PATH, "word/document.xml") TXT_PATH = os.path.join(EXTRACTED_PATH, "word/document.txt") # 提前清理旧文件,避免残留 if os.path.exists(ZIP_PATH): os.remove(ZIP_PATH) if os.path.exists(EXTRACTED_PATH): shutil.rmtree(EXTRACTED_PATH) os.makedirs(os.path.dirname(ZIP_PATH), exist_ok=True) # 复制生成zip shutil.copyfile(DOCX_PATH, ZIP_PATH) # 解压zip with zipfile.ZipFile(ZIP_PATH, 'r') as zip_ref: zip_ref.extractall(EXTRACTED_PATH) # 重命名xml为txt os.rename(XML_PATH, TXT_PATH) # 读取内容 with open(TXT_PATH) as intxt: data = intxt.read()
额外操作建议
- 每次替换新的docx文件后,先重启Jupyter内核再运行代码,清除之前的运行缓存
- 可以在复制生成zip后增加校验逻辑,打印zip文件的大小、修改时间,确认对应新替换的docx文件
内容的提问来源于stack exchange,提问作者Salman.S
相关产品推荐
相关产品推荐

