我的知识记录

Python合并多个CSV文件教程:批量拼接成一张表

用pandas批量合并同一个文件夹下的多个CSV文件,自动追加文件名标记、去表头、统一列名,附完整可运行代码。

场景痛点

运营每周导出一份CSV,攒了半年就是20多个文件;客服按天导出对话记录,几十天几十个CSV。手动一个个打开复制粘贴,表头重复、列顺序不一致、粘贴到最后行数对不上。用Python遍历文件夹一把合并,还能顺手标记数据来源。

用到的库

pip install pandas

完整代码

# Python合并多个CSV文件
import os
import glob
import pandas as pd

def merge_csvs_from_folder(folder_path, output_path, add_source_column=True):
"""
合并一个文件夹下所有CSV文件。
add_source_column=True 时,多加一列"来源文件",方便追溯。
"""
# 找文件夹下所有csv(不区分大小写)
csv_files = sorted(
glob.glob(os.path.join(folder_path, "*.csv")) +
glob.glob(os.path.join(folder_path, "*.CSV"))
)
print(f"找到 {len(csv_files)} 个CSV文件")

if not csv_files:
print("没有CSV文件,退出")
return

dfs = []
for fp in csv_files:
try:
df = pd.read_csv(fp, encoding="utf-8-sig")
except UnicodeDecodeError:
# utf-8读不了就试gbk
df = pd.read_csv(fp, encoding="gbk")

# 加一列来源文件名
if add_source_column:
df["来源文件"] = os.path.basename(fp)
dfs.append(df)
print(f"  已读:{os.path.basename(fp)},{len(dfs[-1])} 行")

# 按列外连接合并,列对不上的自动补NaN
merged = pd.concat(dfs, ignore_index=True, sort=False)

# 可选:去重(完全重复的行只留一条)
merged = merged.drop_duplicates()

merged.to_csv(output_path, index=False, encoding="utf-8-sig")
print(f"合并完成:{output_path},共 {len(merged)} 行,{merged.shape[1]} 列")

def main():
# 把这里换成你放CSV的文件夹
folder = "./csv_files"
output = "merged_all.csv"
merge_csvs_from_folder(folder, output)

if __name__ == "__main__":
main()

代码讲解

  • glob.glob 按扩展名批量找文件,sorted 保证合并顺序稳定。
  • 编码先试 utf-8-sig,失败回退 gbk,兼容Windows各种导出方式。
  • 每个文件读完加一列"来源文件",后面发现问题能定位是哪个文件的脏数据。
  • pd.concat(..., ignore_index=True) 把多个DataFrame按行拼起来,行号重新排。
  • sort=False 避免pandas自动重排列,保持第一个文件的列顺序。
  • drop_duplicates() 顺手去掉完全重复的行,避免某天同一文件导出两次。

运行结果

控制台列出每个文件读取的行数,最后输出合并文件的总行数和列数。当前目录生成 merged_all.csv,打开能看到所有数据拼在一起,最后一列是来源文件名。

注意事项

  • 各文件列名不一致时,concat会按列名对齐,缺失的列填NaN,提前 print(df.columns) 对齐一下。
  • 文件总量超过10GB时不要一次性concat,改用逐文件append到磁盘或Dask。
  • 如果某些文件没有表头,先 pd.read_csv(fp, header=None, names=标准列名) 统一列名再合并。
  • 文件名带中文、路径带空格都没问题,pandas都支持。

Python合并多个CSV文件教程:批量拼接成一张表

标签:

更新时间:2026-09-14 21:03:19

上一篇:Python清洗CSV缺失值教程:填充或删除空值

下一篇:Python CSV按列筛选导出教程:只保留需要的字段