三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

`glob` 模块用于文件路径匹配,以及 `pandas`(通常简写为 `pd`)用于数据处理

`glob` 模块用于文件路径匹配,以及 `pandas`(通常简写为 `pd`)用于数据处理

glob模块用于文件路径匹配,以及pandas(通常简写为pd)用于数据处理。这是一个常见的 Python 数据分析起始组合,常用于批量读取 CSV、Excel 等格式的文件。

例如,典型用法如下:

# 获取当前目录下所有 .csv 文件路径csv_files=glob("*.csv")# 逐个读取并合并为一个 DataFramedf_list=[pd.read_csv(f)forfincsv_files]combined_df=pd.concat(df_list,ignore_index=True)

注意:glob返回的是字符串列表(文件路径),不自动递归子目录(如需递归,可用glob("**/*.csv", recursive=True));pandas需确保已正确安装(pip install pandas),且文件编码、分隔符等需与实际数据匹配,否则读取可能报错。

当多个 CSV 文件列名不一致时,pd.concat()的默认行为是执行“并集”对齐(outer join)

  • 所有出现过的列名都会保留在结果 DataFrame 中(缺失列处填充NaN);
  • 行数据按列名对齐,未匹配的列自动补NaN
  • 若设置join='inner',则只保留所有文件中共有的列名(交集),其余列被丢弃;
  • 若列名完全无交集,结果将包含全部列,但每行仅在其原始文件对应列上有值,其余全为NaN

⚠️ 风险提示:

  • 列名大小写/空格/不可见字符差异(如"Name"vs"name ")会被视为不同列,导致意外冗余或NaN
  • 相同语义但不同列名(如"user_id""id")不会自动合并,需预先标准化;
  • 数据类型可能因列缺失而强制转为objectfloat64(含NaN时整型列会升为浮点)。

✅ 安全合并推荐步骤:

importpandasaspdfromglobimportglob csv_files=glob("*.csv")dfs=[]forfincsv_files:df=pd.read_csv(f)# ✅ 步骤1:统一列名(如转小写、去首尾空格、替换特殊字符)df.columns=df.columns.str.strip().str.lower().str.replace(r'[^a-z0-9_]','_',regex=True)# ✅ 步骤2:可选——显式指定一致的列顺序与默认值(增强可控性)expected_cols=["id","name","age","city"]# 按业务定义标准 schemaforcolinexpected_cols:ifcolnotindf.columns:df[col]=pd.NA# 或 None / np.nan,保持类型一致性df=df[expected_cols]# 强制列顺序dfs.append(df)# ✅ 步骤3:concat 并统一 dtypes(可选)combined=pd.concat(dfs,ignore_index=True,sort=False)combined=combined.convert_dtypes()# 启用 nullable 类型(如 Int64, string)

补充技巧:

  • 使用pd.concat(..., verify_integrity=True)可检测重复索引(非必需,但调试时有用);
  • 对超大文件,建议分批读取 +dtype预设以节省内存;
  • 生产环境强烈建议添加try...except包裹单个read_csv,记录失败文件便于排查。
← 返回列表