
本文详解在使用 `pandas.read_csv()` 读取目录下多个 csv 文件时,因路径拼接错误导致的 `filenotfounderror` 问题,并提供修复后的完整、健壮的批量清洗脚本。
当你调用 pd.read_csv(file) 且 file 仅为文件名(如 "data.csv")时,pandas 默认会在当前工作目录下查找该文件,而非你指定的输入文件夹。若文件实际位于 ./input/ 下,而你未将路径与文件名正确拼接,就会触发经典的 FileNotFoundError: [Errno 2] No such file or directory 错误。
核心问题在于:必须传入完整的绝对路径或相对于当前工作目录的有效相对路径。推荐使用 os.path.join(input_folder_path, file) 构建安全路径(自动适配不同操作系统的路径分隔符),并确保该路径确实指向一个存在的 .csv 文件。
以下是修复后、逻辑清晰、可直接运行的完整代码:
import os
import pandas as pd
def clean_files(input_folder_path, output_folder_path):
"""
批量读取、清洗并保存 CSV 文件:
- 跳过每个文件前5行(如表头/说明行)
- 保存为 cleaned_{原文件名} 到输出目录
"""
# 验证输入路径存在且为目录
if not os.path.isdir(input_folder_path):
raise ValueError(f"输入路径不存在或不是目录: {input_folder_path}")
if not os.path.isdir(output_folder_path):
os.makedirs(output_folder_path) # 自动创建输出目录
# 获取所有 CSV 文件名(不含路径)
csv_files = [f for f in os.listdir(input_folder_path) if f.lower().endswith('.csv')]
if not csv_files:
print("警告:输入目录中未找到任何 CSV 文件。")
return []
cleaned_dfs = [] # 存储清洗后的 DataFrame 列表
for filename in csv_files:
file_path = os.path.join(input_folder_path, filename)
# ✅ 关键修复:使用完整 file_path 读取
try:
df = pd.read_csv(file_path)
print(f"✓ 已读取: {filename} ({len(df)} 行)")
except Exception as e:
print(f"✗ 读取失败 {filename}: {e}")
continue
# 清洗:跳过前5行(注意:iloc[5:] 表示从索引5开始,即丢弃第0~4行)
if len(df) > 5:
df_cleaned = df.iloc[5:].reset_index(drop=True)
else:
print(f"⚠ {filename} 行数不足6行,清洗后为空 DataFrame")
df_cleaned = pd.DataFrame()
# 保存清洗后文件
output_file = os.path.join(output_folder_path, f"cleaned_{filename}")
try:
df_cleaned.to_csv(output_file, index=False)
print(f"✓ 已保存: {output_file}")
except Exception as e:
print(f"✗ 保存失败 {output_file}: {e}")
continue
cleaned_dfs.append(df_cleaned)
# 可选:统一显示各 DataFrame 形状(非内容,避免大量输出)
for i, df in enumerate(cleaned_dfs):
print(f"cleaned_df[{i}] 形状: {df.shape}")
return cleaned_dfs
# 使用示例(请根据实际路径调整)
if __name__ == '__main__':
input_dir = "./input_csv/" # ✅ 确保此路径存在且含 CSV 文件
output_dir = "./cleaned_csv/"
result = clean_files(input_dir, output_dir)
print(f"\n✅ 总共处理完成 {len(result)} 个 CSV 文件。")关键修复点与最佳实践总结:
- ❌ 错误写法:pd.read_csv(file) → 仅传文件名,路径丢失;
- ✅ 正确写法:pd.read_csv(os.path.join(input_folder_path, file)) → 显式构造完整路径;
- ?️ 增加路径存在性校验与异常捕获,避免程序崩溃;
- ? df.iloc[5:] 是切片操作,非“删除前5行”的通用清洗逻辑(如需按条件过滤,请改用 df.drop() 或布尔索引);
- ? 输出文件名使用 cleaned_{filename} 保留原始扩展名,避免生成 .csv.csv;
- ⚠️ 原代码中 cleaned_df = df.append(df) 和重复 append 存在严重逻辑错误(覆盖变量、重复追加),已重构为清晰的列表累积模式。
运行前请确认:
- input_folder_path 下有真实 .csv 文件;
- 你有对应目录的读写权限;
- 当前工作目录(os.getcwd())不影响 os.path.join 的正确性(它始终基于给定路径拼接)。
遵循以上规范,即可彻底规避 FileNotFoundError,实现稳定可靠的批量 CSV 处理。










