使用openpyxl+os遍历Excel文件时触发BadZipFile错误求助
问题解决:openpyxl遍历Excel文件触发BadZipFile错误
错误原因
os.listdir()会返回目标目录下所有文件和子文件夹,包括:
- 非Excel格式的文件
- Excel临时文件(比如开头带
~$的隐藏文件) - 子目录
openpyxl仅支持读取基于XML的Excel格式(.xlsx/.xlsm/.xltx/.xltm),尝试加载非zip结构的文件或文件夹时,就会抛出BadZipFile错误。
解决步骤
- 过滤目标文件:只处理后缀为
.xlsx/.xlsm的Excel文件 - 跳过子目录:判断遍历到的对象是否为文件,而非文件夹
- 优化保存逻辑:循环内频繁保存文件会降低效率,建议循环结束后统一保存
修正后的代码
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
相关产品推荐
相关产品推荐

