如何读取列数可变的分块CSV文件并生成组名对应DataFrame的字典
问题原因
pandas的read_csv默认会以文件第一行的列数作为全局列数解析所有行,你的CSV文件每组列数不固定,导致后续行的字段数和第一行不匹配,抛出解析错误。
适配读取方案
核心思路是先按行拆分分组,每组单独解析为DataFrame:
实现代码
import pandas as pd import io # 读取文件所有行,自动过滤空行 with open('test.batch.csv', 'r', encoding='utf-8') as f: all_lines = [line.rstrip('\n') for line in f if line.strip()] grouped_df_dict = {} # 按每5行一组遍历处理 for idx in range(0, len(all_lines), 5): group_block = all_lines[idx: idx+5] # 取组名 group_key = group_block[0] # 拼接该组的CSV内容(表头+3行业务数据) group_csv = '\n'.join(group_block[1:]) # 单独解析该组为DataFrame,设置第一列为索引(M1/M2/M3列) current_df = pd.read_csv(io.StringIO(group_csv), index_col=0) # 处理重名组:如果存在相同组名,存储为列表;不需要保留历史可直接赋值覆盖 if group_key in grouped_df_dict: grouped_df_dict[group_key].append(current_df) else: grouped_df_dict[group_key] = [current_df]
效果验证
比如要获取第一个K1组的数据,直接访问grouped_df_dict['K1'][0]即可得到对应DataFrame:
| Value | |
|---|---|
| M1 | 0 |
| M2 | 10 |
| M3 | 3 |
可选调整项
- 如果不需要保留重名组,直接修改赋值逻辑为
grouped_df_dict[group_key] = current_df即可 - 如果不需要把M1/M2/M3设为索引,删除
index_col=0参数即可
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

