乐于分享
好东西不私藏

一个脚本解决一个问题 | 合并完 Excel 之后,我只要其中三列怎么办?

一个脚本解决一个问题 | 合并完 Excel 之后,我只要其中三列怎么办?
上周帮市场部处理一批活动数据,200 多个 Excel 文件合并成一个大表之后,同事说:"我只要姓名、手机号、消费金额这三列,其他都不要。"

我当时心想,这不就 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[0if 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]                break    return 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 里提固定列的人,写一次用一年。

觉得有用就转发收藏,一起节省时间。


我是鲁叶的Python,10年互联网古法程序员。
Python/ML/DL/大模型都折腾过,坑也踩了不少。
关注我,第一时间接收分享干货。