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

遍历多级目录读取Excel报错:zipfile.BadZipFile问题求助

解决递归读取多级文件夹xlsx时的引擎和BadZipFile错误

问题根源

  1. 第一个错误Excel file cannot be determined...:用pandas读取Excel时,默认会自动检测文件类型,但部分文件格式模糊,导致无法匹配对应引擎,所以必须手动指定engine='openpyxl'(针对xlsx格式)。
  2. 第二个错误zipfile.BadZipFile:xlsx本质是zip压缩包格式,出现这个错误说明你遍历到的文件后缀是xlsx,但实际不是标准的OOXML格式文件——常见原因包括:
    • 文件损坏、下载/保存不完整
    • 被修改后缀的其他文件(比如把csv/txt重命名成xlsx)
    • 旧版xls文件强行改成xlsx后缀
    • 空文件或0字节的无效文件

解决步骤

1. 先过滤真正的xlsx文件(不止看后缀)

标准xlsx文件的前4个字节是PK\x03\x04(十六进制为50 4B 03 04),可以通过检查这个"魔法数"来过滤无效文件。

2. 用异常捕获跳过坏文件

即使做了前置检查,仍可能遇到损坏的文件,所以必须通过try-except捕获异常,避免程序崩溃,同时记录错误文件路径方便后续排查。

3. 示例代码

import os
import pandas as pd

def is_valid_xlsx(file_path):
    # 验证文件是否为标准xlsx格式
    try:
        with open(file_path, 'rb') as f:
            header = f.read(4)
            return header == b'PK\x03\x04'
    except:
        return False

def read_all_xlsx(root_dir):
    for root, dirs, files in os.walk(root_dir):
        for file in files:
            if file.lower().endswith('.xlsx'):
                file_path = os.path.join(root, file)
                # 先校验文件有效性
                if not is_valid_xlsx(file_path):
                    print(f"跳过无效xlsx文件: {file_path}")
                    continue
                # 尝试读取并捕获异常
                try:
                    df = pd.read_excel(file_path, engine='openpyxl')
                    # 这里添加你处理DataFrame的逻辑(比如合并、分析等)
                    print(f"成功读取: {file_path}")
                except Exception as e:
                    print(f"读取失败 {file_path}: {str(e)}")

# 调用函数,传入你的根目录路径
read_all_xlsx('./')

额外提示

  • 如果文件夹里同时存在xls和xlsx文件,可以分情况指定引擎:xls文件用engine='xlrd'(注意xlrd 2.0+版本仅支持xls格式),xlsx文件用openpyxl。
  • 可以把错误文件路径写入日志文件,后续批量清理或修复这些无效文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:57:10