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都支持。

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