
本文介绍如何通过命令行参数指定路径,利用 Pandas 的 pd.merge() 实现两个 CSV 文件基于唯一公共列的内连接,并输出合并结果到第三文件。
本文介绍如何通过命令行参数指定路径,利用 pandas 的 `pd.merge()` 实现两个 csv 文件基于唯一公共列的内连接,并输出合并结果到第三文件。
在数据处理中,经常需要将多个结构不同但存在关联字段(如 ID、名称等)的 CSV 文件按公共列进行关联合并。本教程提供一个健壮、可复用的 Python 解决方案:接收三个路径参数(源文件1、源文件2、目标输出文件),自动识别两者唯一的公共列,并执行内连接(inner join),仅保留两文件中该列值完全匹配的行,最终导出整合后的 CSV。
核心实现逻辑
- 使用
pandas.read_csv()分别加载两个输入文件为 DataFrame; - 通过集合交集
set(df1.columns) & set(df2.columns)自动识别公共列; - 严格校验:确保恰好存在且仅存在一个公共列,避免歧义或意外全连接;
- 调用
pd.merge(..., on=shared_col, how='inner')执行高效内连接,保留匹配行的所有非重复列; - 输出时设置
index=False避免写入行索引,保持标准 CSV 格式。
完整可运行代码(支持命令行传参)
import pandas as pd
import sys
def merge_csv_files(first_file_path, second_file_path, output_file_path):
try:
first_df = pd.read_csv(first_file_path)
second_df = pd.read_csv(second_file_path)
except FileNotFoundError as e:
raise FileNotFoundError(f"输入文件未找到: {e}")
except Exception as e:
raise ValueError(f"CSV 解析失败: {e}")
shared_columns = set(first_df.columns) & set(second_df.columns)
if len(shared_columns) != 1:
raise ValueError(
f"错误:CSV 文件必须有且仅有一个公共列。"
f"当前公共列为: {list(shared_columns)} (共{len(shared_columns)}个)"
)
shared_column = shared_columns.pop()
# 内连接:只保留 shared_column 值在两表中均存在的行
merged_df = pd.merge(first_df, second_df, on=shared_column, how='inner')
# 写入结果,不保存索引
merged_df.to_csv(output_file_path, index=False)
print(f"✅ 合并完成!共 {len(merged_df)} 行匹配数据已写入: {output_file_path}")
if __name__ == "__main__":
if len(sys.argv) != 4:
print("用法: python merge_csv.py <first.csv><second.csv><third.csv>")
sys.exit(1)
first_path, second_path, output_path = sys.argv[1], sys.argv[2], sys.argv[3]
merge_csv_files(first_path, second_path, output_path)</third.csv></second.csv></first.csv>
使用示例
假设目录下有:
-
first.csv:包含列a,b,c,d -
second.csv:包含列x,y,a,z
执行命令:
python merge_csv.py first.csv second.csv third.csv
输出 third.csv 将包含列 a,b,c,d,x,y,z,且每行的 a 值在原始两文件中严格一致。
注意事项
- ✅ 列名大小写敏感:
A与a被视为不同列,请确保原始 CSV 列名规范统一; - ⚠️ 内存友好性:Pandas 适合中等规模数据(百万行以内);超大数据建议使用 Dask 或数据库;
- ? 安全性提醒:生产环境应增加输入校验(如空文件、编码格式
encoding='utf-8-sig'); - ? 若需其他连接方式(如左连接保留所有 first.csv 行),可将
how='inner'改为'left'。
此方案简洁、健壮、开箱即用,是自动化数据整合任务的理想选择。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











