You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:39:16