我当时心想,这不就 df[['姓名', '手机号', '消费金额']] 一行的事吗?
结果她说:"我知道啊,但我每天都要从不同文件里提不同的列,每次手动选一遍太烦了。"
这种重复性操作,正是 Python 擅长的事。
场景:每天从 50 个 Excel 里提同一组列
假设你每天要处理一批 Excel 文件,文件名类似这样:
2026-05-01_销售数据.xlsx2026-05-02_销售数据.xlsx2026-05-03_销售数据.xlsx...
每个文件有 20 多列,但你只关心其中 3 列:日期、客户名、金额。
手动操作:打开每个文件 → 复制三列 → 粘贴到新表 → 重复 50 次。
用 Python,一个脚本搞定。
脚本:批量提取指定列
import pandas as pdfrom pathlib import Path# ── 配置区 ──INPUT_DIR = Path('./excels') # Excel 文件所在目录OUTPUT_FILE = Path('./提取结果.xlsx') # 输出文件COLUMNS = ['日期', '客户名', '金额'] # 要提取的列名(按顺序)FILE_PATTERN = '*.xlsx' # 文件匹配规则# ── 执行 ──all_data = []files = list(INPUT_DIR.glob(FILE_PATTERN))print(f'找到 {len(files)} 个文件')for f in files:try:df = pd.read_excel(f, usecols=COLUMNS) # 只读指定列,省内存df['来源文件'] = f.name # 可选:标记数据来源all_data.append(df)print(f' ✓ {f.name} ({len(df)} 行)')except Exception as e:print(f' ✗ {f.name}: {e}')if all_data:result = pd.concat(all_data, ignore_index=True)result.to_excel(OUTPUT_FILE, index=False)print(f'\n完成!共 {len(result)} 行,保存到 {OUTPUT_FILE}')else:print('没有成功读取任何文件')
关键点拆解
usecols 参数:只读需要的列
# 默认读所有列df = pd.read_excel('data.xlsx')# 只读指定列(省内存、速度快)df = pd.read_excel('data.xlsx', usecols=['日期', '客户名', '金额'])
200 个文件,每个 20 列,你只取 3 列。usecols 让 pandas 跳过其他 17 列的解析,内存占用直接砍到原来的 1/6。
列名不一致?模糊匹配
现实中的 Excel 列名经常不统一:有的叫"客户名",有的叫"客户姓名",有的叫"姓名",硬写列名会报 KeyError。
# 自动找包含关键词的列def find_column(df, keyword):"""在 df 的列名中找到包含 keyword 的列"""matches = [c for c in df.columns if keyword in c]return matches[0] if matches else None# 用法df = pd.read_excel('data.xlsx')col_date = find_column(df, '日期')col_name = find_column(df, '姓名') # 匹配"客户名"/"客户姓名"/"姓名"col_amount = find_column(df, '金额')df = df[[col_date, col_name, col_amount]]
列名不存在?跳过而不是报错
有些文件可能缺某一列,加个判断:
def safe_extract(df, columns):"""安全提取列,缺少的列跳过"""available = [c for c in columns if c in df.columns]missing = [c for c in columns if c not in df.columns]if missing:print(f' 缺少列: {missing}')return df[available] if available else None
进阶:列名映射表
如果你经常处理来自不同部门的文件,列名五花八门,可以维护一个映射表:
# 不同文件的列名 → 统一列名COLUMN_MAP = {'日期': ['日期', '时间', 'Date', 'date'],'客户': ['客户名', '客户姓名', '姓名', 'Name', '客户'],'金额': ['金额', '消费金额', 'Amount', '金额(元)'],}def normalize_columns(df, column_map):"""把各种列名统一成标准名"""result = {}for standard_name, aliases in column_map.items():for alias in aliases:if alias in df.columns:result[standard_name] = df[alias]breakreturn pd.DataFrame(result)
运行效果
找到 50 个文件✓ 2026-05-01_销售数据.xlsx (312 行)✓ 2026-05-02_销售数据.xlsx (287 行)✓ 2026-05-03_销售数据.xlsx (341 行)...完成!共 15680 行,保存到 ./提取结果.xlsx
50 个文件,3 秒跑完。手动操作的话,光打开文件就得点 100 多次鼠标。
这个脚本不复杂,但胜在实用。
每天要从一堆 Excel 里提固定列的人,写一次用一年。
觉得有用就转发收藏,一起节省时间。
夜雨聆风