如何用Pandas合并含空文件的CSV列表并添加文件名列?
解决CSV合并的三个问题:跳过空文件、高效合并、添加来源文件名
以下是优化后的代码,同时满足你提到的所有需求:
import pandas as pd import os from glob import glob folder = r'C:\Users\_M92\Desktop\myFolder' # 仅匹配文件夹下的CSV文件,避免处理非CSV格式文件 csv_files = glob(os.path.join(folder, '*.csv')) def read_csv_with_source(file_path): try: df = pd.read_csv(file_path, delimiter=';') # 新增列存储当前数据对应的源文件名 df['source_file'] = os.path.basename(file_path) return df except pd.errors.EmptyDataError: # 捕获空文件异常,返回None跳过该文件 return None # 过滤空文件对应的None值,合并有效DataFrame并重置索引 df_combined = pd.concat( [df for df in map(read_csv_with_source, csv_files) if df is not None], ignore_index=True ) display(df_combined)
核心细节说明:
- 跳过空文件:通过
try-except捕获pd.errors.EmptyDataError,遇到空文件时返回None,最后合并阶段过滤掉这些无效值。 - 高效合并:
- 用
glob替代os.listdir,直接筛选.csv后缀文件,避免处理文件夹内的无关文件; - 使用
map+生成器表达式,避免一次性将所有文件加载到列表,节省内存(尤其文件数量多、体积大时); - 加
ignore_index=True重置合并后的索引,避免原文件索引重复导致的混乱。
- 用
- 添加来源文件名:读取每个文件后新增
source_file列,用os.path.basename提取纯文件名(不带路径),方便后续追溯数据来源。
如果你的CSV文件体积极大,还可以进一步优化为分块读取模式,但常规场景下上述代码已足够简洁高效。
内容的提问来源于stack exchange,提问作者Timeless
相关产品推荐
相关产品推荐

