我的知识记录

Python按条件拆分CSV教程:按列值分成多个文件

用pandas按某一列的值把一个大CSV拆成多个小文件,比如按城市、按日期、按类别拆分,自动命名、自动建文件夹,附完整代码。

场景痛点

一份全国订单表,要按城市分别发给各区域负责人;一份全年日志,要按月份拆成12个文件归档。手动筛选、另存为、改名,几十次重复劳动还容易漏。用Python按列groupby一下,自动拆成多个文件并命名好。

用到的库

pip install pandas

完整代码

# Python按条件拆分CSV
import os
import pandas as pd

def split_by_column(input_path, output_dir, column):
"""
按某一列的值拆分,每个值一个CSV文件。
比如按"城市"列拆分,输出 北京.csv、上海.csv...
"""
os.makedirs(output_dir, exist_ok=True)
df = pd.read_csv(input_path, encoding="utf-8-sig")

# 检查列是否存在
if column not in df.columns:
raise ValueError(f"列 {column} 不存在,可用列:{list(df.columns)}")

# 按列分组
grouped = df.groupby(column)
total_files = 0
for key, group in grouped:
# 文件名清洗:去掉非法字符
safe_key = str(key).replace("/", "_").replace("\\", "_").replace(":", "_")
out_path = os.path.join(output_dir, f"{safe_key}.csv")
group.to_csv(out_path, index=False, encoding="utf-8-sig")
print(f"  {safe_key}.csv:{len(group)} 行")
total_files += 1

print(f"拆分完成:{total_files} 个文件,输出到 {output_dir}/")

def split_by_condition(input_path, output_dir, condition_fn, prefix):
"""
按自定义条件拆分,满足条件的进一个文件,不满足的进另一个。
比如"大于1万金额"vs"小于等于1万"。
"""
os.makedirs(output_dir, exist_ok=True)
df = pd.read_csv(input_path, encoding="utf-8-sig")

mask = condition_fn(df)
df_true = df[mask]
df_false = df[~mask]

df_true.to_csv(os.path.join(output_dir, f"{prefix}_true.csv"),
index=False, encoding="utf-8-sig")
df_false.to_csv(os.path.join(output_dir, f"{prefix}_false.csv"),
index=False, encoding="utf-8-sig")
print(f"条件拆分:满足 {len(df_true)} 行,不满足 {len(df_false)} 行")

def main():
input_file = "orders.csv"
out_dir = "split_output"

# 1. 按城市列拆分
split_by_column(input_file, out_dir, column="城市")

# 2. 按条件拆分:金额大于10000的单独一个文件
split_by_condition(
input_file,
out_dir,
condition_fn=lambda df: df["金额"] > 10000,
prefix="high_value",
)

if __name__ == "__main__":
main()

代码讲解

  • df.groupby(列) 把DataFrame按列值分组,遍历每组就是一个小DataFrame。
  • 文件名清洗:/\:*?"<>| 这些字符在Windows文件名里非法,替换成下划线。
  • os.makedirs(output_dir, exist_ok=True) 自动建输出目录,重复运行不报错。
  • 条件拆分用mask布尔索引,df[mask] 取满足的,df[~mask] 取不满足的。
  • 每个拆分文件都带表头,方便单独打开使用。

运行结果

当前目录生成 split_output/ 文件夹,里面按城市一个CSV文件一个,外加 high_value_true.csvhigh_value_false.csv。控制台打印每个文件多少行,方便核对总数是否对得上原文件。

注意事项

  • 拆分后所有文件行数之和应等于原文件行数(除了表头),对一下总数。
  • 某列值特别多时(比如按用户ID拆)会生成成千上万个文件,建议先看 df[列].nunique()
  • 超大文件内存不够时,用chunksize分块读,每块按组追加写入。
  • 文件名带中文在Windows下没问题,但同步到Linux服务器注意编码一致。

Python按条件拆分CSV教程:按列值分成多个文件

标签:

更新时间:2026-09-14 20:54:56

上一篇:Python操作SQLite数据库增删改查完整教程

下一篇:Python读取大文件内存优化实战