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

使用openpyxl+os遍历Excel文件时触发BadZipFile错误求助

问题解决:openpyxl遍历Excel文件触发BadZipFile错误

错误原因

os.listdir()会返回目标目录下所有文件和子文件夹,包括:

  • 非Excel格式的文件
  • Excel临时文件(比如开头带~$的隐藏文件)
  • 子目录

openpyxl仅支持读取基于XML的Excel格式(.xlsx/.xlsm/.xltx/.xltm),尝试加载非zip结构的文件或文件夹时,就会抛出BadZipFile错误。

解决步骤

  1. 过滤目标文件:只处理后缀为.xlsx/.xlsm的Excel文件
  2. 跳过子目录:判断遍历到的对象是否为文件,而非文件夹
  3. 优化保存逻辑:循环内频繁保存文件会降低效率,建议循环结束后统一保存

修正后的代码

import openpyxl
import os

# 初始化输出工作簿
output_path = r"output file location"
output_wb = openpyxl.load_workbook(output_path)
output_sheet = output_wb.active

target_dir = "directory location"

row_num = 2  # 从第二行开始写入,第一行留作表头
for filename in os.listdir(target_dir):
    # 拼接完整路径,适配不同系统的路径分隔符
    file_path = os.path.join(target_dir, filename)
    
    # 跳过子目录
    if not os.path.isfile(file_path):
        continue
    
    # 只处理openpyxl支持的Excel格式
    if not filename.lower().endswith(('.xlsx', '.xlsm', '.xltx', '.xltm')):
        continue
    
    # 跳过Excel临时文件
    if filename.startswith('~$'):
        continue
    
    # 加载Excel文件并提取内容,增加异常捕获避免单个文件出错中断程序
    try:
        wb = openpyxl.load_workbook(file_path)
        sheet = wb.active
        unl_vol = sheet['I3'].value  # 规范使用大写单元格地址
        
        # 写入输出表
        output_sheet[f'A{row_num}'].value = filename
        output_sheet[f'B{row_num}'].value = unl_vol
        
        row_num += 1
    except Exception as e:
        print(f"处理文件 {filename} 时出错: {str(e)}")

# 统一保存输出文件,提升效率
output_wb.save(output_path)

额外说明

  • 使用os.path.join()拼接路径,避免因Windows/Linux路径分隔符差异导致的错误
  • 增加try-except捕获单个文件的处理异常,确保一个文件出错不会中断整个遍历流程
  • 单元格地址建议用大写字母(如I3),符合Excel的规范写法,避免潜在识别问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:47:26