如何用Python合并多CSV文件并将文件名设为首列(含行筛选)
解决方案
你的代码问题在于没有把文件名和对应的CSV数据绑定在一起——循环里反复给df['col1']赋值只会保留最后一个文件名,而且后续合并时也没把这个列加到每个CSV的DataFrame里。另外你还需要实现只提取每个CSV的1-250行的需求,同时处理不同CSV列数不一致的情况(pandas会自动对齐列,缺失值补NaN)。
修改后的代码如下:
import glob import pandas as pd import os # 指定CSV文件路径 path = "C:/Users/Staylor/Documents/Python test" file_list = glob.glob(path + "/*.csv") merged_data = [] for file_path in file_list: # 只读取前250行数据 df = pd.read_csv(file_path, nrows=250) # 在首列插入文件名(仅保留文件名,去掉全路径) df.insert(0, "文件名", os.path.basename(file_path)) merged_data.append(df) # 合并所有DataFrame,自动对齐不同列的CSV excl_merged = pd.concat(merged_data, ignore_index=True) # 导出到Excel excl_merged.to_excel('total_python.xlsx', index=False)
关键修改点说明:
- 绑定文件名与数据:每个CSV读取后立即插入文件名列,确保每一行数据都对应正确的源文件名称,避免后续合并时丢失关联。
- 限制读取行数:通过
pd.read_csv的nrows=250参数直接读取前250行,比读取全部数据后再切片更高效。 - 处理列不一致:使用
pd.concat合并数据(替代已弃用的append方法),它会自动对齐不同CSV的列,缺失的列将填充NaN。 - 优化文件名显示:用
os.path.basename()提取纯文件名,避免首列显示冗长的全路径。
内容的提问来源于stack exchange,提问作者Stephen Taylor
相关产品推荐
相关产品推荐

