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

使用Pandas读取目录下.xlsm文件时出现zipfile.BadZipFile错误求助

解决Pandas读取合并.xlsm文件时的zipfile.BadZipFile错误

问题场景

我是新手,之前处理.csv文件合并完全没问题,但现在尝试把目录下的.xlsm文件读取到Pandas DataFrame并合并成大文件时遇到了问题。

最初运行的代码:

import pandas as pd
import glob
import openpyxl

df = [pd.read_excel(filename,engine="openpyxl") for filename in glob.glob(r'\\data\Designer\BI_Development\BI_2022_Objective\BIDataLake\MTT\Automation\TimeTrackingSheets_Automation\TimeTrackingSheets_Automation\TM_TimeTrackingSheets\*.xlsm')]

执行后触发报错:

zipfile.BadZipFile: File is not a zip file

一开始以为是目录里的同名zip文件导致的,重命名后还是报错,后来排查发现是脚本读取到了隐藏文件。

修复后的代码

通过修改glob匹配规则排除隐藏文件,同时优化了原代码里的冗余逻辑,最终可用代码如下:

import pandas as pd
import glob
import os
import openpyxl

path = r'\\data\Designer\BI_Development\BI_2022_Objective\BIDataLake\MTT\Automation\TimeTrackingSheets_Automation\TimeTrackingSheets_Automation\TM_TimeTrackingSheets'

# 读取所有非隐藏的.xlsm文件,排除以~开头的临时文件
filenames = glob.glob(path + "\[!~]*.xlsm")

# 初始化空DataFrame用于存储合并后的数据
outputxlsx = pd.DataFrame()

# 遍历所有目标文件
for file in filenames:
    # 读取指定工作表"BW_TimeSheet"
    df = pd.read_excel(file, sheet_name=["BW_TimeSheet"])
    df = pd.concat(df.values(), ignore_index=True, sort=False)
    # 添加文件名作为Username字段,标记数据来源
    df['Username'] = os.path.basename(file)
    # 合并到总DataFrame
    outputxlsx = pd.concat([outputxlsx, df], ignore_index=True, sort=False)

print('合并完成,输出文件已生成在指定路径:')
outputxlsx.to_excel(path + "/Output.xlsx", index=False)

关键说明

  • 错误根源:glob.glob("*.xlsm")会匹配到目录里的隐藏文件(比如Excel生成的以~$开头的临时文件),这类文件不是标准的zip格式(xlsm本质是zip压缩包),因此触发zipfile.BadZipFile错误。
  • 解决核心:用glob.glob("[!~]*.xlsm")规则排除以~开头的隐藏文件,确保只读取正常的xlsm文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:27:29