使用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_
相关产品推荐
相关产品推荐

