如何用Pandas读取列数不同的CSV文件并统一为最新格式?
兼容新旧CSV格式的可维护性解决方案
问题背景
我需要逐个读取CSV文件,这些文件的列数可能不同——新版本文件比旧版本包含更多列。示例文件如下:
旧版(4列):
date|time|name|math 20101230|1345|mickey|0.5|
新版1(6列):
date|time|name|math|literature|physics 20101230|1345|mickey|0.5|3.5|9
最新版(8列):
date|time|name|math|literature|physics|chemistry|art 20101230|1345|mickey|0.5|3.5|9|6|7.4
核心需求:输出的DataFrame需始终采用最新格式,读取旧格式文件时,缺失列用默认值初始化(比如上述场景要固定输出8列)。
现有方案可维护性极差,每次新增列都要修改大量硬编码的判断逻辑:
import pandas as pd df = pd.read_csv('input.txt', dtype={'date': int, 'time': int, 'name': str, 'math': float, 'literature': float, 'physics': float, 'chemistry': float, 'art': float}) n_cols = len(df.columns) if n_cols == 4: df['literature'] = 0.0 df['physics'] = 0.0 df['chemistry'] = 0.0 df['art'] = 0.0 elif n_cols == 6: df['chemistry'] = 0.0 df['art'] = 0.0 # 后续新增列还要持续添加elif分支 return df
补充说明:此问题曾因误判与其他问题相似而关闭,但核心不同——我需要加载单个可能缺失列的文件,而非加载多文件后合并。
解决方案:用元数据驱动列补全
核心思路是预先定义最新格式的列元数据(列名、数据类型、默认值),读取文件后自动对比补全缺失列,无需硬编码列数判断。
1. 定义最新格式的元数据
把最新格式的列信息统一维护在一个配置结构中,后续新增列仅需修改此处:
# 最新格式元数据:键为列名,值为(数据类型, 默认值) LATEST_SCHEMA = { 'date': (int, 0), 'time': (int, 0), 'name': (str, ''), 'math': (float, 0.0), 'literature': (float, 0.0), 'physics': (float, 0.0), 'chemistry': (float, 0.0), 'art': (float, 0.0) }
2. 编写兼容读取函数
读取文件后自动对比元数据,补全缺失列并统一数据类型:
import pandas as pd def load_compatible_csv(file_path): # 先读取文件,不指定dtype避免列缺失报错 df = pd.read_csv(file_path, sep='|') # 遍历最新schema,补全缺失列并修正类型 for col_name, (dtype, default_val) in LATEST_SCHEMA.items(): if col_name not in df.columns: df[col_name] = default_val # 强制转换为指定类型 df[col_name] = df[col_name].astype(dtype) # 按最新schema的列顺序重排,保证输出结构一致 df = df[LATEST_SCHEMA.keys()] return df
方案优势
- 可维护性强:新增列仅需在
LATEST_SCHEMA中添加一行,无需修改逻辑代码 - 扩展性高:无论旧文件列数多少,都能自动匹配补全
- 类型安全:统一维护数据类型,避免类型不匹配问题
- 结构统一:强制输出列顺序与最新格式一致,避免后续处理混乱
内容的提问来源于stack exchange,提问作者Huy Le
相关产品推荐
相关产品推荐

