遍历多级目录读取Excel报错:zipfile.BadZipFile问题求助
解决递归读取多级文件夹xlsx时的引擎和BadZipFile错误
问题根源
- 第一个错误
Excel file cannot be determined...:用pandas读取Excel时,默认会自动检测文件类型,但部分文件格式模糊,导致无法匹配对应引擎,所以必须手动指定engine='openpyxl'(针对xlsx格式)。 - 第二个错误
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
相关产品推荐
相关产品推荐

