You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python搜索PPT幻灯片关键词报错:zipfile.BadZipFile问题求助

解决zipfile.BadZipFile: File is not a zip file报错问题

看起来你遇到的问题主要来自两个核心点:没有过滤目录中的非PPT文件,以及文件打开方式不正确。咱们一步步来修复:

报错原因拆解

  • 非PPT文件被误处理:你的代码遍历了当前目录下的所有文件,包括.py.txt这类完全不属于PPT的文件。而python-pptx仅支持基于ZIP格式的.pptx文件,非PPT文件自然会触发“不是zip文件”的错误。
  • 文件打开模式错误:你用open(filename)默认以文本模式打开文件,但.pptx是二进制格式,这种打开方式会破坏文件结构;而且Presentation类其实可以直接接收文件名作为参数,完全不需要手动打开文件。

修正后的完整代码

from pptx import Presentation
import os

def main():
    while True:
        search = input("Keyword: ")
        result = []
        # 只筛选当前目录下的.pptx格式文件
        for filename in os.listdir():
            if not filename.endswith(".pptx"):
                continue  # 跳过所有非PPTX文件
            try:
                # 直接传入文件名,让python-pptx自行处理文件读取逻辑
                pres = Presentation(filename)
                # 遍历幻灯片并记录编号,方便定位内容
                for slide_idx, slide in enumerate(pres.slides, start=1):
                    for shape in slide.shapes:
                        if shape.has_text_frame:
                            for paragraph in shape.text_frame.paragraphs:
                                # 大小写不敏感匹配,提升搜索容错性
                                if search.lower() in paragraph.text.lower():
                                    result.append(f"文件: {filename} | 幻灯片: {slide_idx} | 内容片段: {paragraph.text[:50]}...")
            except Exception as e:
                print(f"处理文件 {filename} 时出错: {str(e)}")
        # 输出搜索结果
        if result:
            print("\n找到匹配内容:")
            for item in result:
                print(f"- {item}")
        else:
            print(f"未找到包含关键词「{search}」的内容")

if __name__ == "__main__":
    main()

关键改进说明

  • 精准过滤文件类型:通过filename.endswith(".pptx")只处理目标格式文件,彻底避免非PPT文件引发的错误。
  • 简化文件初始化流程:直接将文件名传给Presentation,由库内部处理二进制文件的读取,避免手动打开的格式问题。
  • 添加异常捕获:即使遇到损坏的PPT文件,程序也不会崩溃,还能给出明确的错误提示。
  • 优化搜索体验:做大小写不敏感匹配,同时记录幻灯片编号和内容片段,方便快速定位目标位置。

额外提醒:如果你的目录里有老版本的.ppt文件(非PPTX格式),python-pptx是不支持解析的,这种情况可以选择直接跳过,或者借助其他工具先转换为PPTX格式。

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

火山引擎 最新活动