如何编写脚本从指定文件夹多Excel文件按列名提取列并存为CSV或追加到文本
批量提取Excel指定列脚本实现(Python)
依赖安装
处理.xls格式文件需要用到pandas和指定版本的xlrd库,执行以下命令安装:
pip install pandas xlrd==1.2.0
注:xlrd 2.0及以上版本移除了对.xls格式的支持,所以指定安装1.2.0版本。
完整脚本
import os import pandas as pd # -------------------------- 可修改配置项 -------------------------- TARGET_FOLDER = r"C:\你的\目标\文件夹路径" # 存放.xls文件的文件夹 TARGET_COLUMN_NAME = "你要提取的列名" # 需要匹配的目标列名,要和Excel里的列名完全一致 OUTPUT_FILE_PATH = r"C:\你的\输出\结果.csv" # 输出文件,后缀为.txt就存文本,.csv就存CSV格式 INCLUDE_HEADER = True # 输出文件第一行是否保留列名 SHEET_INDEX = 0 # 读取每个Excel的第几个sheet,默认0是第一个sheet # ------------------------------------------------------------------- def main(): # 校验输出文件后缀 support_suffix = [".txt", ".csv"] if not any(OUTPUT_FILE_PATH.lower().endswith(suf) for suf in support_suffix): raise ValueError("仅支持输出.txt或.csv格式的文件") # 遍历目标文件夹下所有.xls文件 xls_file_list = [f for f in os.listdir(TARGET_FOLDER) if f.lower().endswith(".xls")] if not xls_file_list: print("目标文件夹下未找到.xls格式文件") return first_write = True for file_name in xls_file_list: file_full_path = os.path.join(TARGET_FOLDER, file_name) print(f"正在处理文件:{file_name}") try: # 读取Excel文件指定sheet df = pd.read_excel(file_full_path, sheet_name=SHEET_INDEX) # 匹配目标列 if TARGET_COLUMN_NAME not in df.columns: print(f"文件{file_name}中未找到目标列,跳过") continue # 提取目标列 target_df = df[[TARGET_COLUMN_NAME]] # 写入输出文件,追加模式 target_df.to_csv( OUTPUT_FILE_PATH, mode="a", header=INCLUDE_HEADER if first_write else False, index=False, sep="\n" if OUTPUT_FILE_PATH.lower().endswith(".txt") else "," ) if first_write: first_write = False except Exception as e: print(f"处理文件{file_name}失败,错误信息:{str(e)}") continue print(f"处理完成,结果已保存至:{OUTPUT_FILE_PATH}") if __name__ == "__main__": main()
使用说明
- 替换脚本中
可修改配置项区间的参数为你实际的需求即可运行 - 输出为txt格式时,每行存储一条列内容;输出为csv格式时,为标准单列CSV文件
- 匹配列名时默认是精确匹配,如需忽略大小写,可以将匹配逻辑改为
TARGET_COLUMN_NAME.lower() in [col.lower() for col in df.columns],同时提取时先找到对应的原列名再提取
注意事项
- 仅支持处理扩展名为
.xls的旧版Excel文件,如需支持.xlsx格式,可安装openpyxl库后,将文件后缀判断逻辑补充.xlsx即可 - 若Excel文件存在合并单元格、空表头的情况,需要先清理Excel文件的表头结构,否则会出现列名识别错误的问题
- 处理大量文件时可根据需要添加进度提示,也可以对重复内容做去重处理,只需在提取列后调用
drop_duplicates()方法即可
内容的提问来源于stack exchange,提问作者Myna
相关产品推荐
相关产品推荐

