Python3无需Pandas实现多CSV文件按列合并是否可行?
不借助Pandas实现多CSV文件纵向合并
当然可以用Python标准库实现这个需求,完全不需要依赖Pandas。先明确你的场景:你需要将多个CSV文件纵向拼接(按列合并),每行保留对应的源文件名,同时处理不同文件表头顺序不一致的情况(比如你示例里df1和df2的列顺序不同)。
你已通过Pandas实现该功能,对应的中文版本代码如下:
import os import pandas as pd # 需先安装:$ pip install pandas import time def cls(): os.system('cls' if os.name=='nt' else 'clear') cls() today = time.strftime("%y%m%d") fldpath = 'C:/tmp2/test/' filepath = fldpath + today + "_merged.csv" print(os.listdir(fldpath)) print("请输入文件名开头字符") fmask = input() file_list = [fldpath + f for f in os.listdir(fldpath) if f.startswith(fmask)] csv_list = [] for file in sorted(file_list): # 给每个数据框添加源文件名列 csv_list.append(pd.read_csv(file).assign(File_Name = os.path.basename(file))) # 纵向拼接所有数据框 csv_merged = pd.concat(csv_list, ignore_index=True) csv_merged.to_csv(filepath, index=False)
纯Python标准库实现方案
使用Python内置的csv模块就能完成,核心是用DictReader处理表头映射,解决列顺序不一致的问题,代码如下:
import os import time import csv def cls(): os.system('cls' if os.name=='nt' else 'clear') cls() today = time.strftime("%y%m%d") fldpath = 'C:/tmp2/test/' filepath = fldpath + today + "_merged.csv" print(os.listdir(fldpath)) print("请输入文件名开头字符") fmask = input() # 按顺序获取符合条件的文件列表 file_list = sorted([fldpath + f for f in os.listdir(fldpath) if f.startswith(fmask)]) # 第一步:收集所有文件的列名,确定合并后的完整表头 all_columns = set() for file in file_list: with open(file, 'r', newline='', encoding='utf-8') as f: reader = csv.DictReader(f) all_columns.update(reader.fieldnames) # 确定合并后的表头:以第一个文件的表头为基础,补充其他列,最后添加文件名列 merged_columns = [] if file_list: with open(file_list[0], 'r', newline='', encoding='utf-8') as f: merged_columns = csv.DictReader(f).fieldnames.copy() # 补充其他文件特有的列 for col in all_columns: if col not in merged_columns: merged_columns.append(col) merged_columns.append('File_Name') # 第二步:读取每个文件并写入合并结果 with open(filepath, 'w', newline='', encoding='utf-8') as out_file: writer = csv.DictWriter(out_file, fieldnames=merged_columns) writer.writeheader() for file in file_list: file_name = os.path.basename(file) with open(file, 'r', newline='', encoding='utf-8') as in_file: reader = csv.DictReader(in_file) for row in reader: # 添加源文件名 row['File_Name'] = file_name # 给缺失的列补空值,保证结构一致 for col in merged_columns: if col not in row: row[col] = '' writer.writerow(row) print(f"合并完成,结果已保存到:{filepath}")
代码说明
csv.DictReader会把每行数据转换成字典,键是表头列名,自动处理不同文件列顺序不一致的问题- 先收集所有文件的列名,确保合并后的文件不会丢失任何列
- 对每个行数据补充缺失列的空值,保证输出的CSV每行结构统一
- 完全依赖Python标准库,不需要安装任何第三方包
内容的提问来源于stack exchange,提问作者Peter Asp
相关产品推荐
相关产品推荐

