Python循环批量合并CSV文件遇EmptyDataError问题求助
问题描述
有数百个CSV文件需要用Python合并格式化,处理单个文件时逻辑可行:读取文件后指定列名为“Parasites”和文件名,将“Parasites”设为索引,通过外连接合并两个文件后,得到以“Parasites”为索引、各文件第二列为列的结果。但批量循环处理时,运行以下代码持续触发EmptyDataError: No columns to parse from file错误,所有文件均为两列结构(第一列名称、第二列数值):
import os import glob import pandas as pd fmask = '/Users/path/to/files/species/*csv' dfs = [] for f in glob.glob(fmask): df = pd.read_csv(f, sep=',') df.columns=["Parasites",f] df2=df.set_index('Parasites') df3=pd.merge( dfs, df2, how="outer", on =["Parasites"])
错误原因分析
- 缩进语法错误:代码中
dfs = []、df2=df.set_index('Parasites')的缩进不符合Python规范,会导致变量作用域错误或语法解析失败,进而引发数据处理异常。 - 合并逻辑错误:初始
dfs是空列表,直接调用pd.merge(dfs, df2)完全不符合API要求——pd.merge的参数必须是DataFrame对象,而非列表。正确的批量合并逻辑应该是先收集所有处理好的DataFrame,再统一合并。 - CSV读取参数缺失:如果你的CSV文件没有表头行,调用
pd.read_csv(f, sep=',')会默认把第一行数据当成列名,导致后续设置列名时覆盖错误,甚至出现列数不匹配的空数据情况。
修正后的代码
import os import glob import pandas as pd fmask = '/Users/path/to/files/species/*csv' processed_dfs = [] for f in glob.glob(fmask): # 读取无表头的CSV,指定header=None避免把第一行当列名 df = pd.read_csv(f, sep=',', header=None) # 重命名列,用文件名作为第二列的列名(用basename避免路径过长) df.columns = ["Parasites", os.path.basename(f)] # 设置索引 df_indexed = df.set_index('Parasites') # 将处理好的DataFrame加入列表 processed_dfs.append(df_indexed) # 用concat批量外连接合并所有DataFrame,axis=1表示按列合并 final_df = pd.concat(processed_dfs, axis=1, join='outer') # 可选:填充空值为0或其他自定义值 final_df = final_df.fillna(0)
补充说明
如果部分CSV文件确实存在空文件(虽你说明所有文件都是两列),可以在读取时增加异常捕获跳过:
for f in glob.glob(fmask): try: df = pd.read_csv(f, sep=',', header=None) df.columns = ["Parasites", os.path.basename(f)] df_indexed = df.set_index('Parasites') processed_dfs.append(df_indexed) except pd.errors.EmptyDataError: print(f"跳过空文件: {f}") continue
内容的提问来源于stack exchange,提问作者Silvia Justi
相关产品推荐
相关产品推荐

