使用openpyxl读取Excel至Pandas DataFrame触发ValueError求助
解决xlsx文件读取报错的方案
一、先确保文件下载完整(最可能的原因)
你当前用time.sleep(20)等待下载完成不可靠,Chrome下载大文件时会生成.crdownload临时文件,此时重命名会导致文件损坏。替换为监听下载目录的逻辑:
import os import time from glob import glob # 新增等待下载完成的函数 def wait_for_download(download_dir, filename_pattern): while True: # 检查是否存在Chrome临时下载文件 temp_files = glob(os.path.join(download_dir, "*.crdownload")) if not temp_files: # 检查目标文件是否已生成 target_files = glob(os.path.join(download_dir, filename_pattern)) if target_files: return target_files[0] time.sleep(1) # 替换原代码中下载后的等待和文件获取部分 # 删掉time.sleep(20)和f = glob(...)这两行,换成: f = wait_for_download(etf_path, "Fondszusammensetzung_Amundi*") os.rename(f, os.path.join(etf_path, 'test.xlsx'))
二、更换Excel读取引擎
如果文件本身样式复杂,openpyxl无法解析其XML样式表,尝试更换引擎:
1. 使用xlrd引擎(需安装旧版本)
xlrd 1.2.0版本支持xlsx格式,先安装:
pip install xlrd==1.2.0
修改读取代码:
df = pd.read_excel('./ETF/test/test.xlsx', engine='xlrd', skiprows=18, skipfooter=4, header=1, usecols="B:H")
2. 使用pyxlsb引擎
pyxlsb对复杂xlsx文件兼容性较好,先安装:
pip install pyxlsb
修改读取代码:
df = pd.read_excel('./ETF/test/test.xlsx', engine='pyxlsb', skiprows=18, skipfooter=4, header=1, usecols="B:H")
三、修复文件XML格式(Windows环境)
如果文件确实存在XML无效问题,用Excel自动修复:
先安装pywin32:
pip install pywin32
添加修复代码在读取之前:
import win32com.client as win32 # 用Excel打开并保存文件,自动修复格式 excel = win32.gencache.EnsureDispatch('Excel.Application') # 后台运行,不显示界面 excel.Visible = False wb = excel.Workbooks.Open(os.path.abspath('./ETF/test/test.xlsx')) wb.Save() wb.Close() excel.Quit() # 再读取文件 df = pd.read_excel('./ETF/test/test.xlsx', engine='openpyxl', skiprows=18, skipfooter=4, header=1, usecols="B:H")
四、验证文件实际格式
确认下载的文件是否真的是xlsx格式(可能网站返回xls但后缀标为xlsx):
安装python-magic(Windows用python-magic-bin):
# Windows pip install python-magic-bin # Linux/macOS pip install python-magic
检查文件类型:
import magic file_type = magic.from_file('./ETF/test/test.xlsx') print(file_type)
如果输出为Microsoft Excel 97-2003 Worksheet,则用xlrd引擎读取即可。
内容的提问来源于stack exchange,提问作者Economist Learning Python
相关产品推荐
相关产品推荐

