如何使用Python按CSV指定列类别筛选数据并分别保存为新文件
Python实现CSV按第三列类别拆分并单独存储
核心逻辑
- 原始CSV全程仅做只读加载,不执行任何写入操作,完全保留原始文件内容
- 提取第三列所有去重后的类别值
- 按单个类别匹配筛选所有对应行
- 每个类别的筛选结果单独写入新CSV文件,文件名直接用类别名标识,方便查找
方案1:Pandas实现(代码最简,推荐日常使用)
先安装依赖库:pip install pandas
完整代码:
import pandas as pd import os # -------------------------- 按需修改以下配置 -------------------------- RAW_CSV_PATH = "你的原始CSV文件路径.csv" # 替换为本地原始CSV的实际路径 OUTPUT_FOLDER = "分类筛选结果" # 拆分后文件的存放目录 TARGET_COL_INDEX = 2 # 第三列对应索引为2(索引从0开始计数) CSV_SEP = "," # CSV分隔符,制表符分隔就改成"\t" # -------------------------------------------------------------------- # 自动创建输出目录,已存在则跳过 os.makedirs(OUTPUT_FOLDER, exist_ok=True) # 只读加载原始数据,统一按字符串读取避免数字、日期类格式错乱 df = pd.read_csv(RAW_CSV_PATH, sep=CSV_SEP, dtype=str, encoding="utf-8-sig") # 获取第三列所有非空的不重复类别 all_categories = df.iloc[:, TARGET_COL_INDEX].dropna().unique() for category in all_categories: # 筛选当前类别对应的所有行 filtered = df[df.iloc[:, TARGET_COL_INDEX] == category] # 替换类别名里的非法文件名字符,避免保存报错 safe_name = str(category).replace("/", "_").replace("\\", "_").replace(":", "_").replace("*", "_").replace("?", "_") save_path = os.path.join(OUTPUT_FOLDER, f"{safe_name}.csv") # 写入新文件,不保留pandas默认行索引 filtered.to_csv(save_path, index=False, encoding="utf-8-sig")
方案2:原生CSV库实现(无第三方依赖,适合超大文件流式处理)
不需要安装任何额外包,直接用Python自带的csv库即可运行,内存占用更低:
import csv import os # -------------------------- 按需修改以下配置 -------------------------- RAW_CSV_PATH = "你的原始CSV文件路径.csv" OUTPUT_FOLDER = "分类筛选结果" TARGET_COL_INDEX = 2 CSV_SEP = "," # -------------------------------------------------------------------- os.makedirs(OUTPUT_FOLDER, exist_ok=True) # 第一次读取原始文件:获取表头、收集所有类别值 category_set = set() table_header = None with open(RAW_CSV_PATH, "r", encoding="utf-8-sig", newline="") as f: reader = csv.reader(f, delimiter=CSV_SEP) table_header = next(reader) for row in reader: if len(row) > TARGET_COL_INDEX: category_set.add(row[TARGET_COL_INDEX]) # 为每个类别初始化写入器,提前写入表头 file_writer_map = {} for cat in category_set: safe_name = str(cat).replace("/", "_").replace("\\", "_").replace(":", "_").replace("*", "_").replace("?", "_") save_path = os.path.join(OUTPUT_FOLDER, f"{safe_name}.csv") write_file = open(save_path, "w", encoding="utf-8-sig", newline="") writer = csv.writer(write_file, delimiter=CSV_SEP) writer.writerow(table_header) file_writer_map[cat] = (write_file, writer) # 第二次读取原始文件:逐行写入对应类别的结果文件 with open(RAW_CSV_PATH, "r", encoding="utf-8-sig", newline="") as f: reader = csv.reader(f, delimiter=CSV_SEP) next(reader) # 跳过已处理的表头 for row in reader: if len(row) > TARGET_COL_INDEX: current_cat = row[TARGET_COL_INDEX] file_writer_map[current_cat][1].writerow(row) # 关闭所有打开的写入文件 for open_file, _ in file_writer_map.values(): open_file.close()
使用说明
- 运行前把配置段的
RAW_CSV_PATH替换为你自己的原始CSV文件本地路径 - 如果CSV用的不是逗号分隔,修改
CSV_SEP参数即可,比如制表符分隔填"\t"、分号分隔填";" - 所有拆分结果都会存到指定的输出文件夹下,原始文件全程只有读取操作,不会被修改
- 输出文件统一用
utf-8-sig编码,直接用Excel打开不会出现中文乱码 - 代码自动替换了类别名里不能作为文件名的特殊字符,避免保存时报错
内容的提问来源于stack exchange,提问作者Jacob Kim
相关产品推荐
相关产品推荐

