使用Python读取多份同格式Excel:键非首行且列名带引号问题
解决读取多Excel文件的KeyError及表头问题
看来你遇到了两个核心问题:一是Excel的表头不在首行导致列名读取错误,二是列名带引号引发的键匹配失败。下面一步步帮你解决:
错误原因分析
- 表头不在首行:你的代码里用
pd.read_excel()默认把第一行当作列名,但实际数据的键在后面的行,所以读取的列名根本不是你要的"A"/"B"/"C",自然会触发KeyError。 - 列名引号匹配:Excel中显示的带引号列名(比如单元格内容是
"A"),被pandas读取后可能会变成A(不带外层引号),和你代码里写的'"A"'不匹配,这也会导致键错误。
修正后的完整代码
import numpy as np import scipy.io as sio import scipy import matplotlib.pyplot as plt import os import pandas as pd from matplotlib import gridspec from tkinter import filedialog from tkinter import * import scipy.stats as st # GUI选择文件夹 root = Tk() root.withdraw() path = filedialog.askdirectory(parent=root, title='Choose a folder') path = path + '/' print('Folder Selected', path) # 只筛选Excel文件,避免读取无关文件 files = [f for f in os.listdir(path) if f.endswith(('.xlsx', '.xls'))] length = len(files) print('Files inside the folder', files) Files = [] for s in files: # 关键:指定表头所在行(这里假设表头在第2行,0-based索引为1,根据你的实际文件调整!) df = pd.read_excel(path + s, header=1) # 去掉列名前后的引号,统一用无引号的列名访问 df.columns = df.columns.str.strip('"') Files.append(df) # 初始化列表存储各列数据 A = [] B = [] C = [] for df in Files: try: # 现在直接用不带引号的列名访问 A.append(df['A']) B.append(df['B']) C.append(df['C']) except KeyError as e: print(f"Warning: 当前文件缺少列{e},已跳过该列数据") # 可选:如果需要补全空值,添加下面一行 # A.append(pd.Series(dtype='float64'))
关键改动说明
- 指定表头行:
header=1表示用Excel中的第2行(pandas索引从0开始)作为列名,你需要根据自己的文件实际表头位置调整这个数字(比如表头在第3行就写header=2)。 - 处理列名引号:
df.columns.str.strip('"')会把列名前后的引号去掉,这样你就可以用'A'而不是'"A"'来访问列,避免引号格式不匹配的问题。 - 筛选Excel文件:用列表推导式只保留
.xlsx/.xls后缀的文件,防止读取文件夹里的其他文件引发错误。 - 错误捕获:添加
try-except块,避免单个文件缺列导致整个程序崩溃,同时给出提示。
验证步骤
- 先单独读取一个文件,打印列名确认:
这能帮你确认表头行是否正确,以及列名的实际格式,再调整test_df = pd.read_excel(path + files[0], header=1) print(test_df.columns)header参数和引号处理逻辑。
内容的提问来源于stack exchange,提问作者Monica Olvera
相关产品推荐
相关产品推荐

